Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(446)

Unified Diff: pkg/analysis_server/test/analysis_notification_highlights_test.dart

Issue 338683003: Extract 'DartUnitHighlightsComputer' tests into a separate file. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analysis_server/test/analysis_notification_highlights_test.dart
diff --git a/pkg/analysis_server/test/analysis_notification_highlights_test.dart b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..01600b832be42bf2beeed7e213152810f88f3d77
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
@@ -0,0 +1,769 @@
+// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.analysis.notification.highlights;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/computer_highlights.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+import 'reflective_tests.dart';
+
+
+main() {
+ group('notification.highlights', () {
+ runReflectiveTests(_AnalysisNotificationHighlightsTest);
+ });
+}
+
+
+@ReflectiveTestCase()
+class _AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
+ List<_HighlighRegion> regions;
+
+ void assertHasRawRegion(HighlightType type, int offset, int length) {
+ for (_HighlighRegion region in regions) {
+ if (region.offset == offset && region.length == length && region.type ==
+ type.name) {
+ return;
+ }
+ }
+ fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
+ '${regions.join('\n')}');
+ }
+
+ void assertHasRegion(HighlightType type, String search, [int length = -1]) {
+ int offset = findOffset(search);
+ length = findRegionLength(search, length);
+ assertHasRawRegion(type, offset, length);
+ }
+
+ void assertNoRawRegion(HighlightType type, int offset, int length) {
+ for (_HighlighRegion region in regions) {
+ if (region.offset == offset && region.length == length && region.type ==
+ type.name) {
+ fail(
+ 'Not expected to find (offset=$offset; length=$length; type=$type) in\n'
+ '${regions.join('\n')}');
+ }
+ }
+ }
+
+
+ void assertNoRegion(HighlightType type, String search, [int length = -1]) {
+ int offset = findOffset(search);
+ length = findRegionLength(search, length);
+ assertNoRawRegion(type, offset, length);
+ }
+
+ int findRegionLength(String search, int length) {
+ if (length == -1) {
+ length = 0;
+ while (length < search.length) {
+ int c = search.codeUnitAt(length);
+ if (length == 0 && c == '@'.codeUnitAt(0)) {
+ length++;
+ continue;
+ }
+ if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) || c >=
+ 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) || c >= '0'.codeUnitAt(0) && c <=
+ '9'.codeUnitAt(0))) {
+ break;
+ }
+ length++;
+ }
+ }
+ return length;
+ }
+
+ Future prepareHighlights(then()) {
+ addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile);
+ return waitForTasksFinished().then((_) {
+ then();
+ });
+ }
+
+ void processNotification(Notification notification) {
+ if (notification.event == ANALYSIS_HIGHLIGHTS) {
+ String file = notification.getParameter(FILE);
+ if (file == testFile) {
+ regions = [];
+ List<Map<String, Object>> regionsJson = notification.getParameter(
+ REGIONS);
+ for (Map<String, Object> regionJson in regionsJson) {
+ regions.add(new _HighlighRegion.fromJson(regionJson));
+ }
+ }
+ }
+ }
+
+ @override
+ void setUp() {
+ super.setUp();
+ createProject();
+ }
+
+ test_ANNOTATION_hasArguments() {
+ addTestFile('''
+class AAA {
+ const AAA(a, b, c);
+}
+@AAA(1, 2, 3) main() {}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length);
+ assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
+ });
+ }
+
+ test_ANNOTATION_noArguments() {
+ addTestFile('''
+const AAA = 42;
+@AAA main() {}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.ANNOTATION, '@AAA');
+ });
+ }
+
+ test_BUILT_IN_abstract() {
+ addTestFile('''
+abstract class A {};
+main() {
+ var abstract = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
+ assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
+ });
+ }
+
+ test_BUILT_IN_as() {
+ addTestFile('''
+import 'dart:math' as math;
+main() {
+ p as int;
+ var as = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'as math');
+ assertHasRegion(HighlightType.BUILT_IN, 'as int');
+ assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
+ });
+ }
+
+ test_BUILT_IN_deferred() {
+ addTestFile('''
+import 'dart:math' deferred as math;
+main() {
+ var deferred = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
+ assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
+ });
+ }
+
+ test_BUILT_IN_export() {
+ addTestFile('''
+export "dart:math";
+main() {
+ var export = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
+ assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
+ });
+ }
+
+ test_BUILT_IN_external() {
+ addTestFile('''
+class A {
+ external A();
+ external aaa();
+}
+external main() {
+ var external = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'external A()');
+ assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
+ assertHasRegion(HighlightType.BUILT_IN, 'external main()');
+ assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
+ });
+ }
+
+ test_BUILT_IN_factory() {
+ addTestFile('''
+class A {
+ factory A() => null;
+}
+main() {
+ var factory = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
+ assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
+ });
+ }
+
+ test_BUILT_IN_get() {
+ addTestFile('''
+get aaa => 1;
+class A {
+ get bbb => 2;
+}
+main() {
+ var get = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
+ assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
+ assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
+ });
+ }
+
+ test_BUILT_IN_hide() {
+ addTestFile('''
+import 'foo.dart' hide Foo;
+main() {
+ var hide = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
+ assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
+ });
+ }
+
+ test_BUILT_IN_implements() {
+ addTestFile('''
+class A {}
+class B implements A {}
+main() {
+ var implements = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
+ assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
+ });
+ }
+
+ test_BUILT_IN_import() {
+ addTestFile('''
+import "foo.dart";
+main() {
+ var import = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'import "');
+ assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
+ });
+ }
+
+ test_BUILT_IN_library() {
+ addTestFile('''
+library lib;
+main() {
+ var library = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
+ assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
+ });
+ }
+
+ test_BUILT_IN_native() {
+ addTestFile('''
+class A native "A_native" {}
+class B {
+ bbb() native "bbb_native";
+}
+main() {
+ var native = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
+ assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
+ assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
+ });
+ }
+
+ test_BUILT_IN_on() {
+ addTestFile('''
+main() {
+ try {
+ } on int catch (e) {
+ }
+ var on = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'on int');
+ assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
+ });
+ }
+
+ test_BUILT_IN_operator() {
+ addTestFile('''
+class A {
+ operator +(x) => null;
+}
+main() {
+ var operator = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
+ assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
+ });
+ }
+
+ test_BUILT_IN_part() {
+ addTestFile('''
+part "my_part.dart";
+main() {
+ var part = 42;
+}''');
+ addFile('/project/bin/my_part.dart', 'part of lib;');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
+ assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
+ });
+ }
+
+ test_BUILT_IN_partOf() {
+ addTestFile('''
+part of lib;
+main() {
+ var part = 1;
+ var of = 2;
+}''');
+ addFile('/project/bin/my_lib.dart', '''
+library lib;
+part 'test.dart';
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.length);
+ assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
+ assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
+ });
+ }
+
+ test_BUILT_IN_set() {
+ addTestFile('''
+set aaa(x) {}
+class A
+ set bbb(x) {}
+}
+main() {
+ var set = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
+ assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
+ assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
+ });
+ }
+
+ test_BUILT_IN_show() {
+ addTestFile('''
+import 'foo.dart' show Foo;
+main() {
+ var show = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
+ assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
+ });
+ }
+
+ test_BUILT_IN_static() {
+ addTestFile('''
+class A {
+ static aaa;
+ static bbb() {}
+}
+main() {
+ var static = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
+ assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
+ assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
+ });
+ }
+
+ test_BUILT_IN_typedef() {
+ addTestFile('''
+typedef A();
+main() {
+ var typedef = 42;
+}''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
+ assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
+ });
+ }
+
+ test_CLASS() {
+ addTestFile('''
+class AAA {}
+AAA aaa;
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.CLASS, 'AAA {}');
+ assertHasRegion(HighlightType.CLASS, 'AAA aaa');
+ });
+ }
+
+ test_CLASS_notDynamic() {
+ addTestFile('''
+dynamic f() {}
+''');
+ return prepareHighlights(() {
+ assertNoRegion(HighlightType.CLASS, 'dynamic f()');
+ });
+ }
+
+ test_CLASS_notVoid() {
+ addTestFile('''
+void f() {}
+''');
+ return prepareHighlights(() {
+ assertNoRegion(HighlightType.CLASS, 'void f()');
+ });
+ }
+
+ test_CONSTRUCTOR() {
+ addTestFile('''
+class AAA {
+ AAA() {}
+ AAA.name(p) {}
+}
+main() {
+ new AAA();
+ new AAA.name(42);
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
+ assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
+ assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
+ assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
+ });
+ }
+
+ test_DYNAMIC_TYPE() {
+ addTestFile('''
+f() {}
+main(p) {
+ print(p);
+ var v1 = f();
+ int v2;
+ var v3 = v2;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
+ assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
+ assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
+ assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
+ });
+ }
+
+ test_FIELD() {
+ addTestFile('''
+class A {
+ int aaa = 1;
+ int bbb = 2;
+ A([this.bbb = 3]);
+}
+main(A a) {
+ a.aaa = 4;
+ a.bbb = 5;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.FIELD, 'aaa = 1');
+ assertHasRegion(HighlightType.FIELD, 'bbb = 2');
+ assertHasRegion(HighlightType.FIELD, 'bbb = 3');
+ assertHasRegion(HighlightType.FIELD, 'aaa = 4');
+ assertHasRegion(HighlightType.FIELD, 'bbb = 5');
+ });
+ }
+
+ test_FIELD_STATIC() {
+ addTestFile('''
+class A {
+ static aaa = 1;
+ static get bbb => null;
+ static set ccc(x) {}
+}
+main() {
+ A.aaa = 2;
+ A.bbb;
+ A.ccc = 3;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
+ assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
+ assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
+ assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
+ });
+ }
+
+ test_FUNCTION() {
+ addTestFile('''
+fff(p) {}
+main() {
+ fff(42);
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
+ assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
+ });
+ }
+
+ test_FUNCTION_TYPE_ALIAS() {
+ addTestFile('''
+typedef FFF(p);
+main(FFF fff) {
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
+ assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
+ });
+ }
+
+ test_GETTER_DECLARATION() {
+ addTestFile('''
+get aaa => null;
+class A {
+ get bbb => null;
+}
+main(A a) {
+ aaa;
+ a.bbb;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
+ assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
+ assertHasRegion(HighlightType.FIELD_STATIC, 'aaa;');
+ assertHasRegion(HighlightType.FIELD, 'bbb;');
+ });
+ }
+
+ test_IDENTIFIER_DEFAULT() {
+ addTestFile('''
+main() {
+ aaa = 42;
+ bbb(84);
+ CCC ccc;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
+ assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
+ assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
+ });
+ }
+
+ test_IMPORT_PREFIX() {
+ addTestFile('''
+import 'dart:math' as ma;
+main() {
+ ma.max(1, 2);
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
+ assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
+ });
+ }
+
+ test_KEYWORD_void() {
+ addTestFile('''
+void main() {
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.KEYWORD, 'void main()');
+ });
+ }
+
+ test_LITERAL_BOOLEAN() {
+ addTestFile('var V = true;');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
+ });
+ }
+
+ test_LITERAL_DOUBLE() {
+ addTestFile('var V = 4.2;');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
+ });
+ }
+
+ test_LITERAL_INTEGER() {
+ addTestFile('var V = 42;');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
+ });
+ }
+
+ test_LITERAL_STRING() {
+ addTestFile('var V = "abc";');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.length);
+ });
+ }
+
+ test_LOCAL_VARIABLE() {
+ addTestFile('''
+main() {
+ int vvv = 0;
+ vvv;
+ vvv = 1;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
+ assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
+ assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
+ });
+ }
+
+ test_METHOD() {
+ addTestFile('''
+class A {
+ aaa() {}
+ static bbb() {}
+}
+main(A a) {
+ a.aaa();
+ a.aaa;
+ A.bbb();
+ A.bbb;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
+ assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}');
+ assertHasRegion(HighlightType.METHOD, 'aaa();');
+ assertHasRegion(HighlightType.METHOD, 'aaa;');
+ assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
+ assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
+ });
+ }
+
+ test_METHOD_bestType() {
+ addTestFile('''
+main(p) {
+ if (p is List) {
+ p.add(null);
+ }
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.METHOD, 'add(null)');
+ });
+ }
+
+ test_PARAMETER() {
+ addTestFile('''
+main(int p) {
+ p;
+ p = 42;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.PARAMETER, 'p) {');
+ assertHasRegion(HighlightType.PARAMETER, 'p;');
+ assertHasRegion(HighlightType.PARAMETER, 'p = 42');
+ });
+ }
+
+ test_SETTER_DECLARATION() {
+ addTestFile('''
+set aaa(x) {}
+class A {
+ set bbb(x) {}
+}
+main(A a) {
+ aaa = 1;
+ a.bbb = 2;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
+ assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
+ assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
+ assertHasRegion(HighlightType.FIELD, 'bbb = 2');
+ });
+ }
+
+ test_TOP_LEVEL_VARIABLE() {
+ addTestFile('''
+var VVV = 0;
+main() {
+ print(VVV);
+ VVV = 1;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
+ assertHasRegion(HighlightType.FIELD_STATIC, 'VVV);');
+ assertHasRegion(HighlightType.FIELD_STATIC, 'VVV = 1');
+ });
+ }
+
+ test_TYPE_NAME_DYNAMIC() {
+ addTestFile('''
+dynamic main() {
+ dynamic = 42;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
+ assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
+ assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
+ });
+ }
+
+ test_TYPE_PARAMETER() {
+ addTestFile('''
+class A<T> {
+ T fff;
+ T mmm(T p) => null;
+}
+''');
+ return prepareHighlights(() {
+ assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
+ assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
+ assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
+ assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
+ });
+ }
+}
+
+
+class _HighlighRegion {
+ final int length;
+ final int offset;
+ final String type;
+
+ _HighlighRegion(this.type, this.offset, this.length);
+
+ factory _HighlighRegion.fromJson(Map<String, Object> map) {
+ return new _HighlighRegion(map[TYPE], map[OFFSET], map[LENGTH]);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698