Index: pkg/analyzer_plugin/test/support/abstract_context.dart |
diff --git a/pkg/analyzer_plugin/test/support/abstract_context.dart b/pkg/analyzer_plugin/test/support/abstract_context.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..55708d747c02ac5a04d7cfec8c74e2b693e76e62 |
--- /dev/null |
+++ b/pkg/analyzer_plugin/test/support/abstract_context.dart |
@@ -0,0 +1,172 @@ |
+// 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/dart/element/visitor.dart'; |
+import 'package:analyzer/exception/exception.dart'; |
+import 'package:analyzer/file_system/file_system.dart'; |
+import 'package:analyzer/file_system/memory_file_system.dart'; |
+import 'package:analyzer/source/package_map_resolver.dart'; |
+import 'package:analyzer/src/dart/analysis/byte_store.dart'; |
+import 'package:analyzer/src/dart/analysis/driver.dart'; |
+import 'package:analyzer/src/dart/analysis/file_state.dart'; |
+import 'package:analyzer/src/generated/engine.dart'; |
+import 'package:analyzer/src/generated/engine.dart' as engine; |
+import 'package:analyzer/src/generated/sdk.dart'; |
+import 'package:analyzer/src/generated/source_io.dart'; |
+ |
+import 'mock_sdk.dart'; |
+ |
+/** |
+ * Finds an [Element] with the given [name]. |
+ */ |
+Element findChildElement(Element root, String name, [ElementKind kind]) { |
+ Element result = null; |
+ root.accept(new _ElementVisitorFunctionWrapper((Element element) { |
+ if (element.name != name) { |
+ return; |
+ } |
+ if (kind != null && element.kind != kind) { |
+ return; |
+ } |
+ result = element; |
+ })); |
+ return result; |
+} |
+ |
+/** |
+ * A function to be called for every [Element]. |
+ */ |
+typedef void _ElementVisitorFunction(Element element); |
+ |
+class AbstractContextTest { |
+ MemoryResourceProvider provider; |
+ DartSdk sdk; |
+ Map<String, List<Folder>> packageMap; |
+ UriResolver resourceResolver; |
+ |
+ StringBuffer _logBuffer = new StringBuffer(); |
+ FileContentOverlay _fileContentOverlay = new FileContentOverlay(); |
+ AnalysisDriver _driver; |
+ |
+ AnalysisDriver get driver => _driver; |
+ |
+ Source addMetaPackageSource() => addPackageSource( |
+ 'meta', |
+ 'meta.dart', |
+ r''' |
+library meta; |
+ |
+const Required required = const Required(); |
+ |
+class Required { |
+ final String reason; |
+ const Required([this.reason]); |
+} |
+'''); |
+ |
+ Source addPackageSource(String packageName, String filePath, String content) { |
+ packageMap[packageName] = [(newFolder('/pubcache/$packageName'))]; |
+ File file = newFile('/pubcache/$packageName/$filePath', content); |
+ return file.createSource(); |
+ } |
+ |
+ Source addSource(String path, String content, [Uri uri]) { |
+ driver.addFile(path); |
+ driver.changeFile(path); |
+ _fileContentOverlay[path] = content; |
+ return null; |
+ } |
+ |
+ File newFile(String path, [String content]) => |
+ provider.newFile(provider.convertPath(path), content ?? ''); |
+ |
+ Folder newFolder(String path) => |
+ provider.newFolder(provider.convertPath(path)); |
+ |
+ void processRequiredPlugins() { |
+ AnalysisEngine.instance.processRequiredPlugins(); |
+ } |
+ |
+ Future<CompilationUnit> resolveLibraryUnit(Source source) async { |
+ return (await driver.getResult(source.fullName))?.unit; |
+ } |
+ |
+ void setUp() { |
+ processRequiredPlugins(); |
+ setupResourceProvider(); |
+ sdk = new MockSdk(resourceProvider: provider); |
+ resourceResolver = new ResourceUriResolver(provider); |
+ packageMap = new Map<String, List<Folder>>(); |
+ PackageMapUriResolver packageResolver = |
+ new PackageMapUriResolver(provider, packageMap); |
+ SourceFactory sourceFactory = new SourceFactory( |
+ [new DartUriResolver(sdk), packageResolver, resourceResolver]); |
+ PerformanceLog log = new PerformanceLog(_logBuffer); |
+ AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(log); |
+ _driver = new AnalysisDriver( |
+ scheduler, |
+ log, |
+ provider, |
+ new MemoryByteStore(), |
+ _fileContentOverlay, |
+ null, |
+ sourceFactory, |
+ new AnalysisOptionsImpl()); |
+ scheduler.start(); |
+ AnalysisEngine.instance.logger = PrintLogger.instance; |
+ } |
+ |
+ void setupResourceProvider() { |
+ provider = new MemoryResourceProvider(); |
+ } |
+ |
+ void tearDown() { |
+ provider = null; |
+ AnalysisEngine.instance.clearCaches(); |
+ AnalysisEngine.instance.logger = null; |
+ } |
+} |
+ |
+/** |
+ * Instances of the class [PrintLogger] print all of the errors. |
+ */ |
+class PrintLogger implements Logger { |
+ static final Logger instance = new PrintLogger(); |
+ |
+ @override |
+ void logError(String message, [CaughtException exception]) { |
+ print(message); |
+ if (exception != null) { |
+ print(exception); |
+ } |
+ } |
+ |
+ @override |
+ void logInformation(String message, [CaughtException exception]) { |
+ print(message); |
+ if (exception != null) { |
+ print(exception); |
+ } |
+ } |
+} |
+ |
+/** |
+ * Wraps the given [_ElementVisitorFunction] into an instance of |
+ * [engine.GeneralizingElementVisitor]. |
+ */ |
+class _ElementVisitorFunctionWrapper extends GeneralizingElementVisitor { |
+ final _ElementVisitorFunction function; |
+ |
+ _ElementVisitorFunctionWrapper(this.function); |
+ |
+ @override |
+ visitElement(Element element) { |
+ function(element); |
+ super.visitElement(element); |
+ } |
+} |