Index: pkg/analyzer_plugin/test/support/abstract_single_unit.dart |
diff --git a/pkg/analyzer_plugin/test/support/abstract_single_unit.dart b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7faabe2470382c0b719e30a6da6bc3c526e6302a |
--- /dev/null |
+++ b/pkg/analyzer_plugin/test/support/abstract_single_unit.dart |
@@ -0,0 +1,115 @@ |
+// Copyright (c) 2017, 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. |
+ |
+import 'dart:async'; |
+ |
+import 'package:analyzer/dart/ast/ast.dart'; |
+import 'package:analyzer/dart/element/element.dart'; |
+import 'package:analyzer/error/error.dart'; |
+import 'package:analyzer/src/dart/ast/utilities.dart'; |
+import 'package:analyzer/src/dart/error/hint_codes.dart'; |
+import 'package:analyzer/src/generated/java_engine.dart'; |
+import 'package:analyzer/src/generated/source.dart'; |
+import 'package:test/test.dart'; |
+ |
+import 'abstract_context.dart'; |
+ |
+class AbstractSingleUnitTest extends AbstractContextTest { |
+ bool verifyNoTestUnitErrors = true; |
+ |
+ String testCode; |
+ String testFile = '/test.dart'; |
+ Source testSource; |
+ CompilationUnit testUnit; |
+ CompilationUnitElement testUnitElement; |
+ LibraryElement testLibraryElement; |
+ |
+ void addTestSource(String code, [Uri uri]) { |
+ testCode = code; |
+ testSource = addSource(testFile, code, uri); |
+ } |
+ |
+ Element findElement(String name, [ElementKind kind]) { |
+ return findChildElement(testUnitElement, name, kind); |
+ } |
+ |
+ int findEnd(String search) { |
+ return findOffset(search) + search.length; |
+ } |
+ |
+ /** |
+ * Returns the [SimpleIdentifier] at the given search pattern. |
+ */ |
+ SimpleIdentifier findIdentifier(String search) { |
+ return findNodeAtString(search, (node) => node is SimpleIdentifier); |
+ } |
+ |
+ AstNode findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) { |
+ AstNode result = new NodeLocator(offset).searchWithin(testUnit); |
+ if (result != null && predicate != null) { |
+ result = result.getAncestor(predicate); |
+ } |
+ return result; |
+ } |
+ |
+ AstNode findNodeAtString(String search, [Predicate<AstNode> predicate]) { |
+ int offset = findOffset(search); |
+ return findNodeAtOffset(offset, predicate); |
+ } |
+ |
+ Element findNodeElementAtString(String search, |
+ [Predicate<AstNode> predicate]) { |
+ AstNode node = findNodeAtString(search, predicate); |
+ if (node == null) { |
+ return null; |
+ } |
+ return ElementLocator.locate(node); |
+ } |
+ |
+ int findOffset(String search) { |
+ int offset = testCode.indexOf(search); |
+ expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode"); |
+ return offset; |
+ } |
+ |
+ int getLeadingIdentifierLength(String search) { |
+ int length = 0; |
+ while (length < search.length) { |
+ int c = search.codeUnitAt(length); |
+ if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) { |
+ length++; |
+ continue; |
+ } |
+ if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) { |
+ length++; |
+ continue; |
+ } |
+ if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) { |
+ length++; |
+ continue; |
+ } |
+ break; |
+ } |
+ return length; |
+ } |
+ |
+ Future<Null> resolveTestUnit(String code) async { |
+ addTestSource(code); |
+ var result = await driver.getResult(testFile); |
+ testUnit = (result).unit; |
+ if (verifyNoTestUnitErrors) { |
+ expect(result.errors.where((AnalysisError error) { |
+ return error.errorCode != HintCode.DEAD_CODE && |
+ error.errorCode != HintCode.UNUSED_CATCH_CLAUSE && |
+ error.errorCode != HintCode.UNUSED_CATCH_STACK && |
+ error.errorCode != HintCode.UNUSED_ELEMENT && |
+ error.errorCode != HintCode.UNUSED_FIELD && |
+ error.errorCode != HintCode.UNUSED_IMPORT && |
+ error.errorCode != HintCode.UNUSED_LOCAL_VARIABLE; |
+ }), isEmpty); |
+ } |
+ testUnitElement = testUnit.element; |
+ testLibraryElement = testUnitElement.library; |
+ } |
+} |