| /* |
| * Copyright 2013, the Dart project authors. |
| * |
| * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
| * in compliance with the License. You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.dart.tools.ui.internal.text; |
| |
| import com.google.common.collect.Maps; |
| import com.google.dart.engine.source.Source; |
| import com.google.dart.tools.internal.corext.refactoring.util.ReflectionUtils; |
| import com.google.dart.tools.ui.internal.text.editor.SemanticHighlighting; |
| import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingManager.HighlightedPosition; |
| import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingManager.Highlighting; |
| import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingPresenter; |
| import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightingReconciler; |
| import com.google.dart.tools.ui.internal.text.editor.SemanticHighlightings; |
| |
| import org.apache.commons.lang3.StringUtils; |
| import org.eclipse.jface.text.Document; |
| import org.eclipse.jface.text.IDocument; |
| import org.eclipse.jface.text.source.ISourceViewer; |
| |
| import java.lang.reflect.InvocationHandler; |
| import java.lang.reflect.Method; |
| import java.lang.reflect.Proxy; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Test for {@link SemanticHighlightings}. |
| */ |
| public class SemanticHighlightingTest extends |
| com.google.dart.engine.internal.index.AbstractDartTest { |
| private static final Map<Highlighting, SemanticHighlighting> styleToHighlighting = Maps.newHashMap(); |
| private static final SemanticHighlighting[] highlighters = SemanticHighlightings.getSemanticHighlightings(); |
| private static final Highlighting[] styles = new Highlighting[highlighters.length]; |
| static { |
| for (int i = 0; i < highlighters.length; i++) { |
| styles[i] = new Highlighting(null, true); |
| styleToHighlighting.put(styles[i], highlighters[i]); |
| } |
| } |
| |
| private List<HighlightedPosition> positions; |
| |
| public void test_annotation() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "const myAnnotation = 0;", |
| "class MyAnno { const MyAnno(p); }", |
| "@myAnnotation // marker", |
| "var topA;", |
| "@MyAnno(42) // marker", |
| "var topB;", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.ANNOTATION, "@myAnnotation // marker"); |
| assertHasWordPosition(SemanticHighlightings.ANNOTATION, "@MyAnno("); |
| assertHasWordPosition(SemanticHighlightings.ANNOTATION, ") // marker"); |
| } |
| |
| public void test_builtIn_abstract_class() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "abstract class A {", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "abstract class"); |
| } |
| |
| public void test_builtIn_as_operator() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " 0 as String;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "as String"); |
| } |
| |
| public void test_builtIn_as_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " var as = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "as = 0"); |
| } |
| |
| public void test_builtIn_async_bodyModifier() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() async {", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "async {"); |
| } |
| |
| public void test_builtIn_asyncStar_bodyModifier() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() async* {", |
| "}", |
| ""); |
| assertHasPosition(SemanticHighlightings.BUILT_IN, findOffset("async*"), "async*".length()); |
| } |
| |
| public void test_builtIn_await_expression() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() async {", |
| " await 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "await 0"); |
| } |
| |
| public void test_builtIn_await_forEach() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() async {", |
| " await for (var e in []) {}", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "await for"); |
| } |
| |
| public void test_builtIn_const_constructor() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " const A();", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "const A();"); |
| } |
| |
| public void test_builtIn_dynamic_type() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " dynamic v;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "dynamic v;"); |
| } |
| |
| public void test_builtIn_dynamic_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int dynamic = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "dynamic = 0;"); |
| } |
| |
| public void test_builtIn_external_constructor() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " external A();", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "external A();"); |
| } |
| |
| public void test_builtIn_external_function() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "external f();", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "external f();"); |
| } |
| |
| public void test_builtIn_external_method() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " external m();", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "external m();"); |
| } |
| |
| public void test_builtIn_external_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int external = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "external = 0;"); |
| } |
| |
| public void test_builtIn_factory_constructor() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " factory A() {}", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "factory A() {}"); |
| } |
| |
| public void test_builtIn_factory_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int factory = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "factory = 0;"); |
| } |
| |
| public void test_builtIn_get_method() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " get value => 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "get value => 0;"); |
| } |
| |
| public void test_builtIn_get_method_withReturnType() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " int get value => 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "get value => 0;"); |
| } |
| |
| public void test_builtIn_get_topLevel() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "get value => 0;", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "get value => 0;"); |
| } |
| |
| public void test_builtIn_get_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int get = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "get = 0;"); |
| } |
| |
| public void test_builtIn_implements() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class I {}", |
| "class A implements I {", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "implements I {"); |
| } |
| |
| public void test_builtIn_implements_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int implements = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "implements = 0;"); |
| } |
| |
| public void test_builtIn_native_clause() throws Exception { |
| verifyNoTestUnitErrors = false; |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A native 'B' {", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "native 'B' {"); |
| } |
| |
| public void test_builtIn_native_functionBody() throws Exception { |
| verifyNoTestUnitErrors = false; |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f() native 'z';", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "native 'z';"); |
| } |
| |
| public void test_builtIn_on() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class E1 {}", |
| "class E2 {}", |
| "main() {", |
| " try {", |
| " } on E1 catch (e) {", |
| " } on E2 catch (e) {", |
| " }", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "on E1"); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "on E2"); |
| } |
| |
| public void test_builtIn_operator_method() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " operator +(other) => 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "operator +(other) => 0;"); |
| } |
| |
| public void test_builtIn_operator_method_withReturnType() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " int operator +(other) => 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "operator +(other) => 0;"); |
| } |
| |
| public void test_builtIn_operator_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int operator = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "operator = 0;"); |
| } |
| |
| public void test_builtIn_set_method() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " set value(x) {}", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "set value(x)"); |
| } |
| |
| public void test_builtIn_set_method_withReturnType() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " void set value(x) {}", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "set value(x)"); |
| } |
| |
| public void test_builtIn_set_topLevel() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "set value(x) {}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "set value(x)"); |
| } |
| |
| public void test_builtIn_set_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int set = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "set = 0;"); |
| } |
| |
| public void test_builtIn_static_field() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " static var f = 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "static var f ="); |
| } |
| |
| public void test_builtIn_static_method() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " static m() {}", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "static m()"); |
| } |
| |
| public void test_builtIn_syncStar_bodyModifier() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() sync* {", |
| "}", |
| ""); |
| assertHasPosition(SemanticHighlightings.BUILT_IN, findOffset("sync*"), "sync*".length()); |
| } |
| |
| public void test_builtIn_typedef() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "typedef F();", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "typedef F();"); |
| } |
| |
| public void test_builtIn_typedef_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int typedef = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "typedef = 0;"); |
| } |
| |
| public void test_builtIn_yield() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() async* {", |
| " yield 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.BUILT_IN, "yield 0"); |
| } |
| |
| public void test_builtIn_yieldStar() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() async* {", |
| " yield* [];", |
| "}", |
| ""); |
| assertHasPosition(SemanticHighlightings.BUILT_IN, findOffset("yield* []"), "yield*".length()); |
| } |
| |
| public void test_class() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " static const ZERO = 0;", |
| "}", |
| "main() {", |
| " A a = new A ();", |
| " print(A .ZERO);", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.CLASS, "A {"); |
| assertHasWordPosition(SemanticHighlightings.CLASS, "A a ="); |
| assertHasWordPosition(SemanticHighlightings.CLASS, "A ();"); |
| assertHasWordPosition(SemanticHighlightings.CLASS, "A .ZERO"); |
| } |
| |
| public void test_constructor() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " A.name () {}", |
| "}", |
| "main() {", |
| " new A.name ();", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.CONSTRUCTOR, "name () {}"); |
| assertHasWordPosition(SemanticHighlightings.CONSTRUCTOR, "name ();"); |
| } |
| |
| public void test_deprecated() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "@deprecated", |
| "class A {", |
| " @deprecated", |
| " method() {}", |
| " @deprecated", |
| " var field;", |
| " @deprecated", |
| " get myGet => null;", |
| " @deprecated", |
| " set mySet(x) {}", |
| "}", |
| "main() {", |
| " A a;", |
| " a.method ();", |
| " a.field ;", |
| " a.field = 0;", |
| " a.myGet ;", |
| " a.mySet = 1;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "A {"); |
| assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "A a;"); |
| assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "method ();"); |
| assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "field ;"); |
| assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "field ="); |
| assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "myGet ;"); |
| assertHasWordPosition(SemanticHighlightings.DEPRECATED_ELEMENT, "mySet ="); |
| } |
| |
| public void test_deprecated_libraryImport() throws Exception { |
| setFileContent( |
| "ModernLib.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library modernLib;", |
| "")); |
| setFileContent( |
| "DeprecatedLib.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "@deprecated", |
| "library deprecatedLib;", |
| "// const deprecated = 0;", |
| "")); |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library App;", |
| "import 'ModernLib.dart';", |
| "import 'DeprecatedLib.dart';", |
| ""); |
| String search = "'DeprecatedLib.dart'"; |
| assertHasPosition(SemanticHighlightings.DEPRECATED_ELEMENT, findOffset(search), search.length()); |
| } |
| |
| public void test_directive_import_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int import = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "import = 0;"); |
| } |
| |
| public void test_directive_library() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library MyLib;", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "library MyLib;"); |
| } |
| |
| public void test_directive_library_withDocumentComment() throws Exception { |
| preparePositions( |
| "/// filler filler filler filler filler filler filler filler filler filler", |
| "library MyLib;", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "library MyLib;"); |
| } |
| |
| public void test_directive_part() throws Exception { |
| setFileContent("utils.dart", "part of app;"); |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library app;", |
| "part 'utils.dart';", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "part 'utils.dart';"); |
| } |
| |
| public void test_directive_part_variableName() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int part = 0;", |
| "}", |
| ""); |
| assertNoWordPosition(SemanticHighlightings.BUILT_IN, "part = 0;"); |
| } |
| |
| public void test_directive_partOf() throws Exception { |
| Source libSource = setFileContent( |
| "App.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library app;", |
| "part 'Test.dart';", |
| "")); |
| Source unitSource = setFileContent( |
| "Test.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "/**", |
| " * Some DartDoc", |
| " */", |
| "part of app;", |
| "")); |
| parseTestUnits(libSource, unitSource); |
| preparePositions(); |
| assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("part of"), "part of".length()); |
| } |
| |
| public void test_directive_partOf2() throws Exception { |
| Source libSource = setFileContent( |
| "App.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library app;", |
| "part 'Test.dart';", |
| "")); |
| Source unitSource = setFileContent( |
| "Test.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "part of app;", |
| "")); |
| parseTestUnits(libSource, unitSource); |
| preparePositions(); |
| assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("part of"), "part of".length()); |
| } |
| |
| public void test_dynamic() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f(dynParameter ) {", |
| " var dynVar = dynParameter ;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.DYNAMIC_TYPE, "dynVar = "); |
| assertHasWordPosition(SemanticHighlightings.DYNAMIC_TYPE, "dynParameter ;"); |
| } |
| |
| public void test_field_member() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " int field ;", |
| " A(this.field ); // in constructor", |
| "}", |
| "main() {", |
| " A a = new A(0);", |
| " a.field = 0;", |
| " print(a.field ); // reference", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.FIELD, "field ;"); |
| assertHasWordPosition(SemanticHighlightings.FIELD, "field ); // in constructor"); |
| assertHasWordPosition(SemanticHighlightings.FIELD, "field ="); |
| assertHasWordPosition(SemanticHighlightings.FIELD, "field ); // reference"); |
| } |
| |
| public void test_function() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f() {}", |
| "main() {", |
| " f ();", |
| " print(f );", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.FUNCTION, "f ();"); |
| assertHasWordPosition(SemanticHighlightings.FUNCTION, "f );"); |
| } |
| |
| public void test_functionTypeAlias() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "typedef String Foo ();", |
| "main(Foo f) {", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.FUNCTION_TYPE_ALIAS, "Foo ("); |
| assertHasWordPosition(SemanticHighlightings.FUNCTION_TYPE_ALIAS, "Foo f)"); |
| } |
| |
| public void test_getterDeclaration_function() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "get myGetter => 0;", |
| "main() {", |
| " print(myGetter );", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.GETTER_DECLARATION, "myGetter => 0"); |
| } |
| |
| public void test_getterDeclaration_member() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " int get prop => 42;", |
| "}", |
| "main() {", |
| " A a = new A();", |
| " print(a.prop );", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.GETTER_DECLARATION, "prop =>"); |
| assertHasWordPosition(SemanticHighlightings.FIELD, "prop );"); |
| } |
| |
| public void test_importPrefix() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "import 'dart:async' as asy ;", |
| "main() {", |
| " asy .Future f = null;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.IMPORT_PREFIX, "asy ;"); |
| assertHasWordPosition(SemanticHighlightings.IMPORT_PREFIX, "asy .Future"); |
| } |
| |
| public void test_localVariable() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "main() {", |
| " int v = 0;", |
| " v = 1;", |
| " print(v );", |
| "}", |
| ""); |
| // declaration |
| assertHasWordPosition(SemanticHighlightings.LOCAL_VARIABLE_DECLARATION, "v = 0;"); |
| // reference |
| assertHasWordPosition(SemanticHighlightings.LOCAL_VARIABLE, "v = 1;"); |
| assertHasWordPosition(SemanticHighlightings.LOCAL_VARIABLE, "v );"); |
| } |
| |
| public void test_method() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " m () {}", |
| "}", |
| "main() {", |
| " A a = new A();", |
| " a.m ();", |
| " print(a.m );", |
| "}", |
| ""); |
| // declaration |
| assertHasWordPosition(SemanticHighlightings.METHOD_DECLARATION, "m () {}"); |
| // invocation |
| assertHasWordPosition(SemanticHighlightings.METHOD, "m ();"); // invocation |
| // reference |
| assertHasWordPosition(SemanticHighlightings.METHOD, "m );"); |
| } |
| |
| public void test_number() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "var vi1 = 12345 ;", |
| "var vi2 = -23456 ;", |
| "var vd1 = 123.45 ;", |
| "var vd2 = -234.56 ;", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.NUMBER, "12345 ;"); |
| assertHasWordPosition(SemanticHighlightings.NUMBER, "23456 ;"); |
| assertHasWordPosition(SemanticHighlightings.NUMBER, "123.45 ;"); |
| assertHasWordPosition(SemanticHighlightings.NUMBER, "234.56 ;"); |
| } |
| |
| public void test_parameter() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f(int p ) {", |
| " p = 1;", |
| " print(p );", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p ) {"); |
| assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p = 1;"); |
| assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p );"); |
| } |
| |
| public void test_parameter_namedArgument() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "f({int p}) {", |
| "}", |
| "main() {", |
| " f(p : 0);", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.PARAMETER_VARIABLE, "p : 0);"); |
| } |
| |
| public void test_setterDeclaration_function() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "set mySetter (x) {}", |
| "main() {", |
| " mySetter = 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.SETTER_DECLARATION, "mySetter (x)"); |
| } |
| |
| public void test_setterDeclaration_member() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " set prop (x) {}", |
| "}", |
| "main() {", |
| " A a = new A();", |
| " a.prop = 0;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.SETTER_DECLARATION, "prop (x)"); |
| assertHasWordPosition(SemanticHighlightings.FIELD, "prop = 0"); |
| } |
| |
| public void test_staticField_member() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " static int field = 0;", |
| "}", |
| "main() {", |
| " A.field = 1;", |
| " print(A.field );", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field = 0;"); |
| assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field = 1;"); |
| assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field );"); |
| } |
| |
| public void test_staticField_topLevel() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "int field ;", |
| "main() {", |
| " field = 0;", |
| " print(field );", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field ;"); |
| assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field ="); |
| assertHasWordPosition(SemanticHighlightings.STATIC_FIELD, "field );"); |
| } |
| |
| public void test_staticMethod() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class A {", |
| " static m () {}", |
| "}", |
| "main() {", |
| " A.m ();", |
| " print(A.m );", |
| "}", |
| ""); |
| // declaration |
| assertHasWordPosition(SemanticHighlightings.STATIC_METHOD_DECLARATION, "m () {}"); |
| // invocation |
| assertHasWordPosition(SemanticHighlightings.STATIC_METHOD, "m ();"); |
| // reference |
| assertHasWordPosition(SemanticHighlightings.STATIC_METHOD, "m );"); |
| } |
| |
| public void test_typeVariable() throws Exception { |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "class MyClass<T > {", |
| " T value;", |
| " T foo(T t) => null;", |
| "}", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T > {"); |
| assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T value"); |
| assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T foo"); |
| assertHasWordPosition(SemanticHighlightings.TYPE_VARIABLE, "T t)"); |
| } |
| |
| public void xtest_directive_export() throws Exception { |
| // Timing out on build-bot; runs fine locally |
| setFileContent( |
| "Lib.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library lib;", |
| "class A {}", |
| "class B {}", |
| "class C {}", |
| "class D {}")); |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "export 'Lib.dart' show A, B hide C, D;", |
| ""); |
| assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("export "), "export".length()); |
| assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("show A, B"), "show".length()); |
| assertHasPosition(SemanticHighlightings.DIRECTIVE, findOffset("hide C, D"), "hide".length()); |
| } |
| |
| public void xtest_directive_import() throws Exception { |
| // Timing out on build-bot; runs fine locally |
| setFileContent( |
| "Lib.dart", |
| makeSource( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "library lib;")); |
| preparePositions( |
| "// filler filler filler filler filler filler filler filler filler filler", |
| "import 'Lib.dart';", |
| ""); |
| assertHasWordPosition(SemanticHighlightings.DIRECTIVE, "import 'Lib.dart';"); |
| } |
| |
| /** |
| * Asserts that {@link #positions} contains position with given ID, offset and length. |
| */ |
| private void assertHasPosition(String id, int offset, int length) { |
| for (HighlightedPosition position : positions) { |
| Highlighting style = position.getHighlighting(); |
| SemanticHighlighting highlighting = styleToHighlighting.get(style); |
| if (highlighting != null && highlighting.getPreferenceKey().equals(id) |
| && position.getOffset() == offset && position.getLength() == length) { |
| return; |
| } |
| } |
| fail("Position not found: id:" + id + " offset:" + offset + " length:" + length); |
| } |
| |
| /** |
| * Asserts that {@link #positions} contains position with given ID, at offset of "pattern" and |
| * with length of the first space-separate word. |
| */ |
| private void assertHasWordPosition(String id, String pattern) throws Exception { |
| int offset = findOffset(pattern); |
| String word = StringUtils.substringBefore(pattern, " "); |
| assertHasPosition(id, offset, word.length()); |
| } |
| |
| /** |
| * Asserts that {@link #positions} has no position with given ID, offset and length. |
| */ |
| private void assertNoPosition(String id, int offset, int length) { |
| for (HighlightedPosition position : positions) { |
| Highlighting style = position.getHighlighting(); |
| SemanticHighlighting highlighting = styleToHighlighting.get(style); |
| if (highlighting != null && highlighting.getPreferenceKey().equals(id) |
| && position.getOffset() == offset && position.getLength() == length) { |
| fail("Position not expected id:" + id + " offset:" + offset + " length:" + length); |
| } |
| } |
| } |
| |
| /** |
| * Asserts that {@link #positions} has no position with given ID, at offset of "pattern" and with |
| * length of the first space-separate word. |
| */ |
| private void assertNoWordPosition(String id, String pattern) throws Exception { |
| int offset = findOffset(pattern); |
| String word = StringUtils.substringBefore(pattern, " "); |
| assertNoPosition(id, offset, word.length()); |
| } |
| |
| private void preparePositions() throws Exception { |
| final IDocument document = new Document(testCode); |
| SemanticHighlightingReconciler reconciler = new SemanticHighlightingReconciler(); |
| // configure |
| ReflectionUtils.setField(reconciler, "fSourceViewer", Proxy.newProxyInstance( |
| getClass().getClassLoader(), |
| new Class[] {ISourceViewer.class}, |
| new InvocationHandler() { |
| @Override |
| public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
| if (method.getName().equals("getDocument")) { |
| return document; |
| } |
| return null; |
| } |
| })); |
| ReflectionUtils.setField(reconciler, "fJobSemanticHighlightings", highlighters); |
| ReflectionUtils.setField(reconciler, "fJobHighlightings", styles); |
| ReflectionUtils.setField(reconciler, "fJobPresenter", new SemanticHighlightingPresenter()); |
| // call "reconcilePositions" |
| ReflectionUtils.invokeMethod( |
| reconciler, |
| "reconcilePositions(com.google.dart.engine.ast.CompilationUnit)", |
| testUnit); |
| // get result |
| positions = ReflectionUtils.getFieldObject(reconciler, "fAddedPositions"); |
| // touch "default" |
| for (HighlightedPosition position : positions) { |
| Highlighting style = position.getHighlighting(); |
| SemanticHighlighting highlighting = styleToHighlighting.get(style); |
| highlighting.getDisplayName(); |
| highlighting.isEnabledByDefault(); |
| highlighting.isBoldByDefault(); |
| highlighting.isItalicByDefault(); |
| highlighting.isStrikethroughByDefault(); |
| highlighting.isUnderlineByDefault(); |
| highlighting.getDefaultDefaultTextColor(); |
| highlighting.getDefaultStyle(); |
| highlighting.getDefaultTextColor(); |
| } |
| } |
| |
| private void preparePositions(String... lines) throws Exception { |
| parseTestUnit(lines); |
| preparePositions(); |
| } |
| } |