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

Side by Side Diff: pkg/compiler/lib/src/compiler.dart

Issue 1884793002: dart2js: remove references to compiler in ResolvedUriTranslator (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 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
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.compiler_base; 5 library dart2js.compiler_base;
6 6
7 import 'dart:async' show EventSink, Future; 7 import 'dart:async' show EventSink, Future;
8 8
9 import '../compiler_new.dart' as api; 9 import '../compiler_new.dart' as api;
10 import 'cache_strategy.dart' show CacheStrategy; 10 import 'cache_strategy.dart' show CacheStrategy;
11 import 'closure.dart' as closureMapping show ClosureTask; 11 import 'closure.dart' as closureMapping show ClosureTask;
12 import 'common.dart';
13 import 'common/backend_api.dart' show Backend; 12 import 'common/backend_api.dart' show Backend;
14 import 'common/codegen.dart' show CodegenImpact, CodegenWorkItem; 13 import 'common/codegen.dart' show CodegenWorkItem;
14 import 'common/names.dart' show Selectors;
15 import 'common/names.dart' show Identifiers, Uris; 15 import 'common/names.dart' show Identifiers, Uris;
16 import 'common/registry.dart' show EagerRegistry, Registry; 16 import 'common/registry.dart' show EagerRegistry, Registry;
17 import 'common/resolution.dart' 17 import 'common/resolution.dart'
18 show Parsing, Resolution, ResolutionWorkItem, ResolutionImpact; 18 show Parsing, Resolution, ResolutionWorkItem, ResolutionImpact;
19 import 'common/tasks.dart' show CompilerTask, GenericTask; 19 import 'common/tasks.dart' show CompilerTask, GenericTask;
20 import 'common/work.dart' show ItemCompilationContext, WorkItem; 20 import 'common/work.dart' show ItemCompilationContext, WorkItem;
21 import 'common.dart';
21 import 'compile_time_constants.dart'; 22 import 'compile_time_constants.dart';
22 import 'constants/values.dart'; 23 import 'constants/values.dart';
23 import 'core_types.dart' show CoreClasses, CoreTypes; 24 import 'core_types.dart' show CoreClasses, CoreTypes;
24 import 'dart_backend/dart_backend.dart' as dart_backend; 25 import 'dart_backend/dart_backend.dart' as dart_backend;
25 import 'dart_types.dart' show DartType, DynamicType, InterfaceType, Types; 26 import 'dart_types.dart' show DartType, DynamicType, InterfaceType, Types;
26 import 'deferred_load.dart' show DeferredLoadTask, OutputUnit; 27 import 'deferred_load.dart' show DeferredLoadTask;
27 import 'diagnostics/code_location.dart'; 28 import 'diagnostics/code_location.dart';
28 import 'diagnostics/diagnostic_listener.dart' show DiagnosticReporter; 29 import 'diagnostics/diagnostic_listener.dart' show DiagnosticReporter;
29 import 'diagnostics/invariant.dart' show REPORT_EXCESS_RESOLUTION; 30 import 'diagnostics/invariant.dart' show REPORT_EXCESS_RESOLUTION;
30 import 'diagnostics/messages.dart' show Message, MessageTemplate; 31 import 'diagnostics/messages.dart' show Message, MessageTemplate;
31 import 'dump_info.dart' show DumpInfoTask; 32 import 'dump_info.dart' show DumpInfoTask;
32 import 'elements/elements.dart'; 33 import 'elements/elements.dart';
33 import 'elements/modelx.dart' 34 import 'elements/modelx.dart' show ErroneousElementX;
34 show
35 ErroneousElementX,
36 ClassElementX,
37 CompilationUnitElementX,
38 DeferredLoaderGetterElementX,
39 MethodElementX,
40 LibraryElementX,
41 PrefixElementX;
42 import 'enqueue.dart' 35 import 'enqueue.dart'
43 show 36 show
44 CodegenEnqueuer, 37 CodegenEnqueuer,
45 Enqueuer, 38 Enqueuer,
46 EnqueueTask, 39 EnqueueTask,
47 ResolutionEnqueuer, 40 ResolutionEnqueuer,
48 QueueFilter; 41 QueueFilter;
49 import 'environment.dart'; 42 import 'environment.dart';
50 import 'id_generator.dart'; 43 import 'id_generator.dart';
51 import 'io/source_information.dart' show SourceInformation; 44 import 'io/source_information.dart' show SourceInformation;
52 import 'js_backend/backend_helpers.dart' as js_backend show BackendHelpers; 45 import 'js_backend/backend_helpers.dart' as js_backend show BackendHelpers;
53 import 'js_backend/js_backend.dart' as js_backend show JavaScriptBackend; 46 import 'js_backend/js_backend.dart' as js_backend show JavaScriptBackend;
54 import 'library_loader.dart' 47 import 'library_loader.dart'
55 show 48 show
56 ElementScanner, 49 ElementScanner,
57 LibraryLoader, 50 LibraryLoader,
58 LibraryLoaderTask, 51 LibraryLoaderTask,
59 LoadedLibraries, 52 LoadedLibraries,
60 LibraryLoaderListener, 53 LibraryLoaderListener,
61 ResolvedUriTranslator,
62 ScriptLoader; 54 ScriptLoader;
63 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask; 55 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
64 import 'common/names.dart' show Selectors;
65 import 'null_compiler_output.dart' show NullCompilerOutput, NullSink; 56 import 'null_compiler_output.dart' show NullCompilerOutput, NullSink;
66 import 'options.dart' show CompilerOptions, DiagnosticOptions, ParserOptions; 57 import 'options.dart' show CompilerOptions, DiagnosticOptions, ParserOptions;
67 import 'parser/diet_parser_task.dart' show DietParserTask; 58 import 'parser/diet_parser_task.dart' show DietParserTask;
68 import 'parser/element_listener.dart' show ScannerOptions; 59 import 'parser/element_listener.dart' show ScannerOptions;
69 import 'parser/parser_task.dart' show ParserTask; 60 import 'parser/parser_task.dart' show ParserTask;
70 import 'patch_parser.dart' show PatchParserTask; 61 import 'patch_parser.dart' show PatchParserTask;
71 import 'resolution/registry.dart' show ResolutionRegistry; 62 import 'resolution/registry.dart' show ResolutionRegistry;
72 import 'resolution/resolution.dart' show ResolverTask; 63 import 'resolution/resolution.dart' show ResolverTask;
73 import 'resolution/tree_elements.dart' show TreeElementMapping; 64 import 'resolution/tree_elements.dart' show TreeElementMapping;
65 import 'resolved_uri_translator.dart';
74 import 'scanner/scanner_task.dart' show ScannerTask; 66 import 'scanner/scanner_task.dart' show ScannerTask;
67 import 'script.dart' show Script;
75 import 'serialization/task.dart' show SerializationTask; 68 import 'serialization/task.dart' show SerializationTask;
76 import 'script.dart' show Script;
77 import 'ssa/nodes.dart' show HInstruction; 69 import 'ssa/nodes.dart' show HInstruction;
78 import 'tracer.dart' show Tracer;
79 import 'tokens/token.dart' show StringToken, Token, TokenPair; 70 import 'tokens/token.dart' show StringToken, Token, TokenPair;
80 import 'tokens/token_map.dart' show TokenMap; 71 import 'tokens/token_map.dart' show TokenMap;
72 import 'tracer.dart' show Tracer;
81 import 'tree/tree.dart' show Node, TypeAnnotation; 73 import 'tree/tree.dart' show Node, TypeAnnotation;
82 import 'typechecker.dart' show TypeCheckerTask; 74 import 'typechecker.dart' show TypeCheckerTask;
83 import 'types/types.dart' as ti; 75 import 'types/types.dart' as ti;
84 import 'universe/call_structure.dart' show CallStructure; 76 import 'universe/call_structure.dart' show CallStructure;
85 import 'universe/selector.dart' show Selector; 77 import 'universe/selector.dart' show Selector;
86 import 'universe/universe.dart' show Universe; 78 import 'universe/universe.dart' show Universe;
87 import 'universe/use.dart' show StaticUse; 79 import 'universe/use.dart' show StaticUse;
88 import 'universe/world_impact.dart' show ImpactStrategy, WorldImpact; 80 import 'universe/world_impact.dart' show ImpactStrategy, WorldImpact;
89 import 'util/util.dart' show Link, Setlet; 81 import 'util/util.dart' show Link, Setlet;
90 import 'world.dart' show World; 82 import 'world.dart' show World;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 * If true, stop compilation after type inference is complete. Used for 126 * If true, stop compilation after type inference is complete. Used for
135 * debugging and testing purposes only. 127 * debugging and testing purposes only.
136 */ 128 */
137 bool stopAfterTypeInference = false; 129 bool stopAfterTypeInference = false;
138 130
139 /// Output provider from user of Compiler API. 131 /// Output provider from user of Compiler API.
140 api.CompilerOutput userOutputProvider; 132 api.CompilerOutput userOutputProvider;
141 133
142 List<Uri> librariesToAnalyzeWhenRun; 134 List<Uri> librariesToAnalyzeWhenRun;
143 135
144 /// The set of platform libraries reported as unsupported. 136 ResolvedUriTranslator get resolvedUriTranslator;
145 ///
146 /// For instance when importing 'dart:io' without '--categories=Server'.
147 Set<Uri> disallowedLibraryUris = new Setlet<Uri>();
148 137
149 Tracer tracer; 138 Tracer tracer;
150 139
151 CompilerTask measuredTask; 140 CompilerTask measuredTask;
152 LibraryElement coreLibrary; 141 LibraryElement coreLibrary;
153 LibraryElement asyncLibrary; 142 LibraryElement asyncLibrary;
154 143
155 LibraryElement mainApp; 144 LibraryElement mainApp;
156 FunctionElement mainFunction; 145 FunctionElement mainFunction;
157 146
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 throw new ArgumentError('--dump-info is not supported for dart2dart.'); 322 throw new ArgumentError('--dump-info is not supported for dart2dart.');
334 } 323 }
335 } 324 }
336 325
337 if (options.dumpInfo && options.useStartupEmitter) { 326 if (options.dumpInfo && options.useStartupEmitter) {
338 throw new ArgumentError( 327 throw new ArgumentError(
339 '--dump-info is not supported with the fast startup emitter'); 328 '--dump-info is not supported with the fast startup emitter');
340 } 329 }
341 330
342 tasks = [ 331 tasks = [
343 dietParser = new DietParserTask(this, parsing.parserOptions, idGenerator), 332 dietParser = new DietParserTask(
333 this, parsing.parserOptions, idGenerator, backend, reporter),
344 scanner = createScannerTask(), 334 scanner = createScannerTask(),
345 serialization = new SerializationTask(this), 335 serialization = new SerializationTask(this),
346 libraryLoader = new LibraryLoaderTask( 336 libraryLoader = new LibraryLoaderTask(
347 this, 337 this,
348 new _ResolvedUriTranslator(this), 338 new _ResolvedUriTranslator(this),
349 new _ScriptLoader(this), 339 new _ScriptLoader(this),
350 new _ElementScanner(scanner), 340 new _ElementScanner(scanner),
351 this.serialization, 341 this.serialization,
352 this, 342 this,
353 environment), 343 environment),
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 @deprecated 385 @deprecated
396 int getNextFreeId() => idGenerator.getNextFreeId(); 386 int getNextFreeId() => idGenerator.getNextFreeId();
397 387
398 void unimplemented(Spannable spannable, String methodName) { 388 void unimplemented(Spannable spannable, String methodName) {
399 reporter.internalError(spannable, "$methodName not implemented."); 389 reporter.internalError(spannable, "$methodName not implemented.");
400 } 390 }
401 391
402 // Compiles the dart script at [uri]. 392 // Compiles the dart script at [uri].
403 // 393 //
404 // The resulting future will complete with true if the compilation 394 // The resulting future will complete with true if the compilation
405 // succeded. 395 // succeeded.
406 Future<bool> run(Uri uri) { 396 Future<bool> run(Uri uri) {
407 totalCompileTime.start(); 397 totalCompileTime.start();
408 398
409 return new Future.sync(() => runInternal(uri)) 399 return new Future.sync(() => runInternal(uri))
410 .catchError((error) => _reporter.onError(uri, error)) 400 .catchError((error) => _reporter.onError(uri, error))
411 .whenComplete(() { 401 .whenComplete(() {
412 tracer.close(); 402 tracer.close();
413 totalCompileTime.stop(); 403 totalCompileTime.stop();
414 }).then((_) { 404 }).then((_) {
415 return !compilationFailed; 405 return !compilationFailed;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 if (chainCount > chainLimit) { 507 if (chainCount > chainLimit) {
518 // Assume there are more import chains. 508 // Assume there are more import chains.
519 importChains.add('...'); 509 importChains.add('...');
520 return false; 510 return false;
521 } 511 }
522 return true; 512 return true;
523 }); 513 });
524 return importChains; 514 return importChains;
525 } 515 }
526 516
527 /// Register that [uri] was recognized but disallowed as a dependency.
528 ///
529 /// For instance import of 'dart:io' without '--categories=Server'.
530 void registerDisallowedLibraryUse(Uri uri) {
531 disallowedLibraryUris.add(uri);
532 }
533
534 /// This method is called when all new libraries loaded through 517 /// This method is called when all new libraries loaded through
535 /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports 518 /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
536 /// have been computed. 519 /// have been computed.
537 /// 520 ///
538 /// [loadedLibraries] contains the newly loaded libraries. 521 /// [loadedLibraries] contains the newly loaded libraries.
539 /// 522 ///
540 /// The method returns a [Future] allowing for the loading of additional 523 /// The method returns a [Future] allowing for the loading of additional
541 /// libraries. 524 /// libraries.
542 Future onLibrariesLoaded(LoadedLibraries loadedLibraries) { 525 Future onLibrariesLoaded(LoadedLibraries loadedLibraries) {
543 return new Future.sync(() { 526 return new Future.sync(() {
544 for (Uri uri in disallowedLibraryUris) { 527 var disallowedLibraries =
528 resolvedUriTranslator?.disallowedLibraryUris ?? const <Uri>[];
529 for (Uri uri in disallowedLibraries) {
545 if (loadedLibraries.containsLibrary(uri)) { 530 if (loadedLibraries.containsLibrary(uri)) {
546 Set<String> importChains = 531 Set<String> importChains =
547 computeImportChainsFor(loadedLibraries, uri); 532 computeImportChainsFor(loadedLibraries, uri);
548 reporter.reportInfo( 533 reporter.reportInfo(
549 NO_LOCATION_SPANNABLE, MessageKind.DISALLOWED_LIBRARY_IMPORT, { 534 NO_LOCATION_SPANNABLE, MessageKind.DISALLOWED_LIBRARY_IMPORT, {
550 'uri': uri, 535 'uri': uri,
551 'importChain': importChains 536 'importChain': importChains
552 .join(MessageTemplate.DISALLOWED_LIBRARY_IMPORT_PADDING) 537 .join(MessageTemplate.DISALLOWED_LIBRARY_IMPORT_PADDING)
553 }); 538 });
554 } 539 }
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 return !BENIGN_ERRORS.contains(message.message.kind); 1090 return !BENIGN_ERRORS.contains(message.message.kind);
1106 } 1091 }
1107 1092
1108 void fatalDiagnosticReported(DiagnosticMessage message, 1093 void fatalDiagnosticReported(DiagnosticMessage message,
1109 List<DiagnosticMessage> infos, api.Diagnostic kind) { 1094 List<DiagnosticMessage> infos, api.Diagnostic kind) {
1110 if (markCompilationAsFailed(message, kind)) { 1095 if (markCompilationAsFailed(message, kind)) {
1111 compilationFailed = true; 1096 compilationFailed = true;
1112 } 1097 }
1113 } 1098 }
1114 1099
1115 // TODO(sigmund): move this dart doc somewhere else too.
1116 /**
1117 * Translates the [resolvedUri] into a readable URI.
1118 *
1119 * The [importingLibrary] holds the library importing [resolvedUri] or
1120 * [:null:] if [resolvedUri] is loaded as the main library. The
1121 * [importingLibrary] is used to grant access to internal libraries from
1122 * platform libraries and patch libraries.
1123 *
1124 * If the [resolvedUri] is not accessible from [importingLibrary], this method
1125 * is responsible for reporting errors.
1126 *
1127 * See [LibraryLoader] for terminology on URIs.
1128 */
1129 Uri translateResolvedUri(
1130 LibraryElement importingLibrary, Uri resolvedUri, Spannable spannable) {
1131 unimplemented(importingLibrary, 'Compiler.translateResolvedUri');
1132 return null;
1133 }
1134
1135 /** 1100 /**
1136 * Reads the script specified by the [readableUri]. 1101 * Reads the script specified by the [readableUri].
1137 * 1102 *
1138 * See [LibraryLoader] for terminology on URIs. 1103 * See [LibraryLoader] for terminology on URIs.
1139 */ 1104 */
1140 Future<Script> readScript(Uri readableUri, [Spannable node]) { 1105 Future<Script> readScript(Uri readableUri, [Spannable node]) {
1141 unimplemented(node, 'Compiler.readScript'); 1106 unimplemented(node, 'Compiler.readScript');
1142 return null; 1107 return null;
1143 } 1108 }
1144 1109
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after
1904 ResolvedAst getResolvedAst(Element element) { 1869 ResolvedAst getResolvedAst(Element element) {
1905 if (hasResolvedAst(element)) { 1870 if (hasResolvedAst(element)) {
1906 AstElement astElement = element; 1871 AstElement astElement = element;
1907 return astElement.resolvedAst; 1872 return astElement.resolvedAst;
1908 } 1873 }
1909 assert(invariant(element, hasResolvedAst(element), 1874 assert(invariant(element, hasResolvedAst(element),
1910 message: "ResolvedAst not available for $element.")); 1875 message: "ResolvedAst not available for $element."));
1911 return null; 1876 return null;
1912 } 1877 }
1913 1878
1914
1915 @override 1879 @override
1916 bool hasResolutionImpact(Element element) { 1880 bool hasResolutionImpact(Element element) {
1917 return _resolutionImpactCache.containsKey(element); 1881 return _resolutionImpactCache.containsKey(element);
1918 } 1882 }
1919 1883
1920 @override 1884 @override
1921 ResolutionImpact getResolutionImpact(Element element) { 1885 ResolutionImpact getResolutionImpact(Element element) {
1922 ResolutionImpact resolutionImpact = _resolutionImpactCache[element]; 1886 ResolutionImpact resolutionImpact = _resolutionImpactCache[element];
1923 assert(invariant(element, resolutionImpact != null, 1887 assert(invariant(element, resolutionImpact != null,
1924 message: "ResolutionImpact not available for $element.")); 1888 message: "ResolutionImpact not available for $element."));
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
2012 1976
2013 @override 1977 @override
2014 void parsePatchClass(ClassElement cls) { 1978 void parsePatchClass(ClassElement cls) {
2015 compiler.patchParser.measure(() { 1979 compiler.patchParser.measure(() {
2016 if (cls.isPatch) { 1980 if (cls.isPatch) {
2017 compiler.patchParser.parsePatchClassNode(cls); 1981 compiler.patchParser.parsePatchClassNode(cls);
2018 } 1982 }
2019 }); 1983 });
2020 } 1984 }
2021 1985
2022 ScannerOptions getScannerOptionsFor(Element element) => 1986 ScannerOptions getScannerOptionsFor(Element element) => new ScannerOptions(
2023 new ScannerOptions.from(compiler, element.library); 1987 canUseNative: compiler.backend.canLibraryUseNative(element.library));
2024 1988
2025 ParserOptions get parserOptions => compiler.options; 1989 ParserOptions get parserOptions => compiler.options;
2026 } 1990 }
2027 1991
2028 class GlobalDependencyRegistry extends EagerRegistry { 1992 class GlobalDependencyRegistry extends EagerRegistry {
2029 final Compiler compiler; 1993 final Compiler compiler;
2030 Setlet<Element> _otherDependencies; 1994 Setlet<Element> _otherDependencies;
2031 1995
2032 GlobalDependencyRegistry(this.compiler) : super('GlobalDependencies', null); 1996 GlobalDependencyRegistry(this.compiler) : super('GlobalDependencies', null);
2033 1997
(...skipping 10 matching lines...) Expand all
2044 _otherDependencies.add(element.implementation); 2008 _otherDependencies.add(element.implementation);
2045 } 2009 }
2046 2010
2047 Iterable<Element> get otherDependencies { 2011 Iterable<Element> get otherDependencies {
2048 return _otherDependencies != null ? _otherDependencies : const <Element>[]; 2012 return _otherDependencies != null ? _otherDependencies : const <Element>[];
2049 } 2013 }
2050 } 2014 }
2051 2015
2052 // TODO(sigmund): in the future, each of these classes should be self contained 2016 // TODO(sigmund): in the future, each of these classes should be self contained
2053 // and not use references to `compiler`. 2017 // and not use references to `compiler`.
2018 // TODO(het): This class is an ugly hack because we need a
2019 // [ResolvedUriTranslator] at compiler construction time, but the actual
2020 // translator isn't set until the compiler actually starts running.
Siggi Cherem (dart-lang) 2016/04/13 15:53:35 Some ideas to make it more self explanatory: - re
Harry Terkelsen 2016/04/13 20:23:40 Done.
2054 class _ResolvedUriTranslator implements ResolvedUriTranslator { 2021 class _ResolvedUriTranslator implements ResolvedUriTranslator {
2055 Compiler compiler; 2022 Compiler compiler;
2056 _ResolvedUriTranslator(this.compiler); 2023 _ResolvedUriTranslator(this.compiler);
2057 2024
2025 @override
2058 Uri translate(LibraryElement importingLibrary, Uri resolvedUri, 2026 Uri translate(LibraryElement importingLibrary, Uri resolvedUri,
2059 [Spannable spannable]) => 2027 [Spannable spannable]) =>
2060 compiler.translateResolvedUri(importingLibrary, resolvedUri, spannable); 2028 compiler.resolvedUriTranslator
2029 .translate(importingLibrary, resolvedUri, spannable);
2030
2031 @override
2032 Set<Uri> get disallowedLibraryUris =>
2033 compiler.resolvedUriTranslator.disallowedLibraryUris;
2034
2035 @override
2036 bool get mockableLibraryUsed =>
2037 compiler.resolvedUriTranslator.mockableLibraryUsed;
2038
2039 @override
2040 Map<String, Uri> get sdkLibraries =>
2041 compiler.resolvedUriTranslator.sdkLibraries;
2061 } 2042 }
2062 2043
2063 class _ScriptLoader implements ScriptLoader { 2044 class _ScriptLoader implements ScriptLoader {
2064 Compiler compiler; 2045 Compiler compiler;
2065 _ScriptLoader(this.compiler); 2046 _ScriptLoader(this.compiler);
2066 2047
2067 Future<Script> readScript(Uri uri, [Spannable spannable]) => 2048 Future<Script> readScript(Uri uri, [Spannable spannable]) =>
2068 compiler.readScript(uri, spannable); 2049 compiler.readScript(uri, spannable);
2069 } 2050 }
2070 2051
2071 class _ElementScanner implements ElementScanner { 2052 class _ElementScanner implements ElementScanner {
2072 ScannerTask scanner; 2053 ScannerTask scanner;
2073 _ElementScanner(this.scanner); 2054 _ElementScanner(this.scanner);
2074 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library); 2055 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library);
2075 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit); 2056 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit);
2076 } 2057 }
2077 2058
2078 class _EmptyEnvironment implements Environment { 2059 class _EmptyEnvironment implements Environment {
2079 const _EmptyEnvironment(); 2060 const _EmptyEnvironment();
2080 2061
2081 String valueOf(String key) => null; 2062 String valueOf(String key) => null;
2082 } 2063 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698