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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library test.domain.analysis.notification.highlights;
6
7 import 'dart:async';
8
9 import 'package:analysis_server/src/analysis_server.dart';
10 import 'package:analysis_server/src/computer/computer_highlights.dart';
11 import 'package:analysis_server/src/constants.dart';
12 import 'package:analysis_server/src/protocol.dart';
13 import 'package:unittest/unittest.dart';
14
15 import 'analysis_abstract.dart';
16 import 'reflective_tests.dart';
17
18
19 main() {
20 group('notification.highlights', () {
21 runReflectiveTests(_AnalysisNotificationHighlightsTest);
22 });
23 }
24
25
26 @ReflectiveTestCase()
27 class _AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
28 List<_HighlighRegion> regions;
29
30 void assertHasRawRegion(HighlightType type, int offset, int length) {
31 for (_HighlighRegion region in regions) {
32 if (region.offset == offset && region.length == length && region.type ==
33 type.name) {
34 return;
35 }
36 }
37 fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
38 '${regions.join('\n')}');
39 }
40
41 void assertHasRegion(HighlightType type, String search, [int length = -1]) {
42 int offset = findOffset(search);
43 length = findRegionLength(search, length);
44 assertHasRawRegion(type, offset, length);
45 }
46
47 void assertNoRawRegion(HighlightType type, int offset, int length) {
48 for (_HighlighRegion region in regions) {
49 if (region.offset == offset && region.length == length && region.type ==
50 type.name) {
51 fail(
52 'Not expected to find (offset=$offset; length=$length; type=$type) i n\n'
53 '${regions.join('\n')}');
54 }
55 }
56 }
57
58
59 void assertNoRegion(HighlightType type, String search, [int length = -1]) {
60 int offset = findOffset(search);
61 length = findRegionLength(search, length);
62 assertNoRawRegion(type, offset, length);
63 }
64
65 int findRegionLength(String search, int length) {
66 if (length == -1) {
67 length = 0;
68 while (length < search.length) {
69 int c = search.codeUnitAt(length);
70 if (length == 0 && c == '@'.codeUnitAt(0)) {
71 length++;
72 continue;
73 }
74 if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) || c >=
75 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) || c >= '0'.codeUnitAt(0 ) && c <=
76 '9'.codeUnitAt(0))) {
77 break;
78 }
79 length++;
80 }
81 }
82 return length;
83 }
84
85 Future prepareHighlights(then()) {
86 addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile);
87 return waitForTasksFinished().then((_) {
88 then();
89 });
90 }
91
92 void processNotification(Notification notification) {
93 if (notification.event == ANALYSIS_HIGHLIGHTS) {
94 String file = notification.getParameter(FILE);
95 if (file == testFile) {
96 regions = [];
97 List<Map<String, Object>> regionsJson = notification.getParameter(
98 REGIONS);
99 for (Map<String, Object> regionJson in regionsJson) {
100 regions.add(new _HighlighRegion.fromJson(regionJson));
101 }
102 }
103 }
104 }
105
106 @override
107 void setUp() {
108 super.setUp();
109 createProject();
110 }
111
112 test_ANNOTATION_hasArguments() {
113 addTestFile('''
114 class AAA {
115 const AAA(a, b, c);
116 }
117 @AAA(1, 2, 3) main() {}
118 ''');
119 return prepareHighlights(() {
120 assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length);
121 assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
122 });
123 }
124
125 test_ANNOTATION_noArguments() {
126 addTestFile('''
127 const AAA = 42;
128 @AAA main() {}
129 ''');
130 return prepareHighlights(() {
131 assertHasRegion(HighlightType.ANNOTATION, '@AAA');
132 });
133 }
134
135 test_BUILT_IN_abstract() {
136 addTestFile('''
137 abstract class A {};
138 main() {
139 var abstract = 42;
140 }''');
141 return prepareHighlights(() {
142 assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
143 assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
144 });
145 }
146
147 test_BUILT_IN_as() {
148 addTestFile('''
149 import 'dart:math' as math;
150 main() {
151 p as int;
152 var as = 42;
153 }''');
154 return prepareHighlights(() {
155 assertHasRegion(HighlightType.BUILT_IN, 'as math');
156 assertHasRegion(HighlightType.BUILT_IN, 'as int');
157 assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
158 });
159 }
160
161 test_BUILT_IN_deferred() {
162 addTestFile('''
163 import 'dart:math' deferred as math;
164 main() {
165 var deferred = 42;
166 }''');
167 return prepareHighlights(() {
168 assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
169 assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
170 });
171 }
172
173 test_BUILT_IN_export() {
174 addTestFile('''
175 export "dart:math";
176 main() {
177 var export = 42;
178 }''');
179 return prepareHighlights(() {
180 assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
181 assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
182 });
183 }
184
185 test_BUILT_IN_external() {
186 addTestFile('''
187 class A {
188 external A();
189 external aaa();
190 }
191 external main() {
192 var external = 42;
193 }''');
194 return prepareHighlights(() {
195 assertHasRegion(HighlightType.BUILT_IN, 'external A()');
196 assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
197 assertHasRegion(HighlightType.BUILT_IN, 'external main()');
198 assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
199 });
200 }
201
202 test_BUILT_IN_factory() {
203 addTestFile('''
204 class A {
205 factory A() => null;
206 }
207 main() {
208 var factory = 42;
209 }''');
210 return prepareHighlights(() {
211 assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
212 assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
213 });
214 }
215
216 test_BUILT_IN_get() {
217 addTestFile('''
218 get aaa => 1;
219 class A {
220 get bbb => 2;
221 }
222 main() {
223 var get = 42;
224 }''');
225 return prepareHighlights(() {
226 assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
227 assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
228 assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
229 });
230 }
231
232 test_BUILT_IN_hide() {
233 addTestFile('''
234 import 'foo.dart' hide Foo;
235 main() {
236 var hide = 42;
237 }''');
238 return prepareHighlights(() {
239 assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
240 assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
241 });
242 }
243
244 test_BUILT_IN_implements() {
245 addTestFile('''
246 class A {}
247 class B implements A {}
248 main() {
249 var implements = 42;
250 }''');
251 return prepareHighlights(() {
252 assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
253 assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
254 });
255 }
256
257 test_BUILT_IN_import() {
258 addTestFile('''
259 import "foo.dart";
260 main() {
261 var import = 42;
262 }''');
263 return prepareHighlights(() {
264 assertHasRegion(HighlightType.BUILT_IN, 'import "');
265 assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
266 });
267 }
268
269 test_BUILT_IN_library() {
270 addTestFile('''
271 library lib;
272 main() {
273 var library = 42;
274 }''');
275 return prepareHighlights(() {
276 assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
277 assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
278 });
279 }
280
281 test_BUILT_IN_native() {
282 addTestFile('''
283 class A native "A_native" {}
284 class B {
285 bbb() native "bbb_native";
286 }
287 main() {
288 var native = 42;
289 }''');
290 return prepareHighlights(() {
291 assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
292 assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
293 assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
294 });
295 }
296
297 test_BUILT_IN_on() {
298 addTestFile('''
299 main() {
300 try {
301 } on int catch (e) {
302 }
303 var on = 42;
304 }''');
305 return prepareHighlights(() {
306 assertHasRegion(HighlightType.BUILT_IN, 'on int');
307 assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
308 });
309 }
310
311 test_BUILT_IN_operator() {
312 addTestFile('''
313 class A {
314 operator +(x) => null;
315 }
316 main() {
317 var operator = 42;
318 }''');
319 return prepareHighlights(() {
320 assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
321 assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
322 });
323 }
324
325 test_BUILT_IN_part() {
326 addTestFile('''
327 part "my_part.dart";
328 main() {
329 var part = 42;
330 }''');
331 addFile('/project/bin/my_part.dart', 'part of lib;');
332 return prepareHighlights(() {
333 assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
334 assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
335 });
336 }
337
338 test_BUILT_IN_partOf() {
339 addTestFile('''
340 part of lib;
341 main() {
342 var part = 1;
343 var of = 2;
344 }''');
345 addFile('/project/bin/my_lib.dart', '''
346 library lib;
347 part 'test.dart';
348 ''');
349 return prepareHighlights(() {
350 assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.length);
351 assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
352 assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
353 });
354 }
355
356 test_BUILT_IN_set() {
357 addTestFile('''
358 set aaa(x) {}
359 class A
360 set bbb(x) {}
361 }
362 main() {
363 var set = 42;
364 }''');
365 return prepareHighlights(() {
366 assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
367 assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
368 assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
369 });
370 }
371
372 test_BUILT_IN_show() {
373 addTestFile('''
374 import 'foo.dart' show Foo;
375 main() {
376 var show = 42;
377 }''');
378 return prepareHighlights(() {
379 assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
380 assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
381 });
382 }
383
384 test_BUILT_IN_static() {
385 addTestFile('''
386 class A {
387 static aaa;
388 static bbb() {}
389 }
390 main() {
391 var static = 42;
392 }''');
393 return prepareHighlights(() {
394 assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
395 assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
396 assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
397 });
398 }
399
400 test_BUILT_IN_typedef() {
401 addTestFile('''
402 typedef A();
403 main() {
404 var typedef = 42;
405 }''');
406 return prepareHighlights(() {
407 assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
408 assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
409 });
410 }
411
412 test_CLASS() {
413 addTestFile('''
414 class AAA {}
415 AAA aaa;
416 ''');
417 return prepareHighlights(() {
418 assertHasRegion(HighlightType.CLASS, 'AAA {}');
419 assertHasRegion(HighlightType.CLASS, 'AAA aaa');
420 });
421 }
422
423 test_CLASS_notDynamic() {
424 addTestFile('''
425 dynamic f() {}
426 ''');
427 return prepareHighlights(() {
428 assertNoRegion(HighlightType.CLASS, 'dynamic f()');
429 });
430 }
431
432 test_CLASS_notVoid() {
433 addTestFile('''
434 void f() {}
435 ''');
436 return prepareHighlights(() {
437 assertNoRegion(HighlightType.CLASS, 'void f()');
438 });
439 }
440
441 test_CONSTRUCTOR() {
442 addTestFile('''
443 class AAA {
444 AAA() {}
445 AAA.name(p) {}
446 }
447 main() {
448 new AAA();
449 new AAA.name(42);
450 }
451 ''');
452 return prepareHighlights(() {
453 assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
454 assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
455 assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
456 assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
457 });
458 }
459
460 test_DYNAMIC_TYPE() {
461 addTestFile('''
462 f() {}
463 main(p) {
464 print(p);
465 var v1 = f();
466 int v2;
467 var v3 = v2;
468 }
469 ''');
470 return prepareHighlights(() {
471 assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
472 assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
473 assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
474 assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
475 });
476 }
477
478 test_FIELD() {
479 addTestFile('''
480 class A {
481 int aaa = 1;
482 int bbb = 2;
483 A([this.bbb = 3]);
484 }
485 main(A a) {
486 a.aaa = 4;
487 a.bbb = 5;
488 }
489 ''');
490 return prepareHighlights(() {
491 assertHasRegion(HighlightType.FIELD, 'aaa = 1');
492 assertHasRegion(HighlightType.FIELD, 'bbb = 2');
493 assertHasRegion(HighlightType.FIELD, 'bbb = 3');
494 assertHasRegion(HighlightType.FIELD, 'aaa = 4');
495 assertHasRegion(HighlightType.FIELD, 'bbb = 5');
496 });
497 }
498
499 test_FIELD_STATIC() {
500 addTestFile('''
501 class A {
502 static aaa = 1;
503 static get bbb => null;
504 static set ccc(x) {}
505 }
506 main() {
507 A.aaa = 2;
508 A.bbb;
509 A.ccc = 3;
510 }
511 ''');
512 return prepareHighlights(() {
513 assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
514 assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
515 assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
516 assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
517 });
518 }
519
520 test_FUNCTION() {
521 addTestFile('''
522 fff(p) {}
523 main() {
524 fff(42);
525 }
526 ''');
527 return prepareHighlights(() {
528 assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
529 assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
530 });
531 }
532
533 test_FUNCTION_TYPE_ALIAS() {
534 addTestFile('''
535 typedef FFF(p);
536 main(FFF fff) {
537 }
538 ''');
539 return prepareHighlights(() {
540 assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
541 assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
542 });
543 }
544
545 test_GETTER_DECLARATION() {
546 addTestFile('''
547 get aaa => null;
548 class A {
549 get bbb => null;
550 }
551 main(A a) {
552 aaa;
553 a.bbb;
554 }
555 ''');
556 return prepareHighlights(() {
557 assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
558 assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
559 assertHasRegion(HighlightType.FIELD_STATIC, 'aaa;');
560 assertHasRegion(HighlightType.FIELD, 'bbb;');
561 });
562 }
563
564 test_IDENTIFIER_DEFAULT() {
565 addTestFile('''
566 main() {
567 aaa = 42;
568 bbb(84);
569 CCC ccc;
570 }
571 ''');
572 return prepareHighlights(() {
573 assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
574 assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
575 assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
576 });
577 }
578
579 test_IMPORT_PREFIX() {
580 addTestFile('''
581 import 'dart:math' as ma;
582 main() {
583 ma.max(1, 2);
584 }
585 ''');
586 return prepareHighlights(() {
587 assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
588 assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
589 });
590 }
591
592 test_KEYWORD_void() {
593 addTestFile('''
594 void main() {
595 }
596 ''');
597 return prepareHighlights(() {
598 assertHasRegion(HighlightType.KEYWORD, 'void main()');
599 });
600 }
601
602 test_LITERAL_BOOLEAN() {
603 addTestFile('var V = true;');
604 return prepareHighlights(() {
605 assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
606 });
607 }
608
609 test_LITERAL_DOUBLE() {
610 addTestFile('var V = 4.2;');
611 return prepareHighlights(() {
612 assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
613 });
614 }
615
616 test_LITERAL_INTEGER() {
617 addTestFile('var V = 42;');
618 return prepareHighlights(() {
619 assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
620 });
621 }
622
623 test_LITERAL_STRING() {
624 addTestFile('var V = "abc";');
625 return prepareHighlights(() {
626 assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.length);
627 });
628 }
629
630 test_LOCAL_VARIABLE() {
631 addTestFile('''
632 main() {
633 int vvv = 0;
634 vvv;
635 vvv = 1;
636 }
637 ''');
638 return prepareHighlights(() {
639 assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
640 assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
641 assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
642 });
643 }
644
645 test_METHOD() {
646 addTestFile('''
647 class A {
648 aaa() {}
649 static bbb() {}
650 }
651 main(A a) {
652 a.aaa();
653 a.aaa;
654 A.bbb();
655 A.bbb;
656 }
657 ''');
658 return prepareHighlights(() {
659 assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
660 assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}');
661 assertHasRegion(HighlightType.METHOD, 'aaa();');
662 assertHasRegion(HighlightType.METHOD, 'aaa;');
663 assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
664 assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
665 });
666 }
667
668 test_METHOD_bestType() {
669 addTestFile('''
670 main(p) {
671 if (p is List) {
672 p.add(null);
673 }
674 }
675 ''');
676 return prepareHighlights(() {
677 assertHasRegion(HighlightType.METHOD, 'add(null)');
678 });
679 }
680
681 test_PARAMETER() {
682 addTestFile('''
683 main(int p) {
684 p;
685 p = 42;
686 }
687 ''');
688 return prepareHighlights(() {
689 assertHasRegion(HighlightType.PARAMETER, 'p) {');
690 assertHasRegion(HighlightType.PARAMETER, 'p;');
691 assertHasRegion(HighlightType.PARAMETER, 'p = 42');
692 });
693 }
694
695 test_SETTER_DECLARATION() {
696 addTestFile('''
697 set aaa(x) {}
698 class A {
699 set bbb(x) {}
700 }
701 main(A a) {
702 aaa = 1;
703 a.bbb = 2;
704 }
705 ''');
706 return prepareHighlights(() {
707 assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
708 assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
709 assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
710 assertHasRegion(HighlightType.FIELD, 'bbb = 2');
711 });
712 }
713
714 test_TOP_LEVEL_VARIABLE() {
715 addTestFile('''
716 var VVV = 0;
717 main() {
718 print(VVV);
719 VVV = 1;
720 }
721 ''');
722 return prepareHighlights(() {
723 assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
724 assertHasRegion(HighlightType.FIELD_STATIC, 'VVV);');
725 assertHasRegion(HighlightType.FIELD_STATIC, 'VVV = 1');
726 });
727 }
728
729 test_TYPE_NAME_DYNAMIC() {
730 addTestFile('''
731 dynamic main() {
732 dynamic = 42;
733 }
734 ''');
735 return prepareHighlights(() {
736 assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
737 assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
738 assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
739 });
740 }
741
742 test_TYPE_PARAMETER() {
743 addTestFile('''
744 class A<T> {
745 T fff;
746 T mmm(T p) => null;
747 }
748 ''');
749 return prepareHighlights(() {
750 assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
751 assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
752 assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
753 assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
754 });
755 }
756 }
757
758
759 class _HighlighRegion {
760 final int length;
761 final int offset;
762 final String type;
763
764 _HighlighRegion(this.type, this.offset, this.length);
765
766 factory _HighlighRegion.fromJson(Map<String, Object> map) {
767 return new _HighlighRegion(map[TYPE], map[OFFSET], map[LENGTH]);
768 }
769 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698