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

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

Issue 2488353004: Remove Compiler access from ResolutionEnqueuer (Closed)
Patch Set: Updated cf. comments. Created 4 years, 1 month 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
« no previous file with comments | « pkg/compiler/lib/src/common/resolution.dart ('k') | pkg/compiler/lib/src/dump_info.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 import 'tokens/token_map.dart' show TokenMap; 69 import 'tokens/token_map.dart' show TokenMap;
70 import 'tracer.dart' show Tracer; 70 import 'tracer.dart' show Tracer;
71 import 'tree/tree.dart' show Node, TypeAnnotation; 71 import 'tree/tree.dart' show Node, TypeAnnotation;
72 import 'typechecker.dart' show TypeCheckerTask; 72 import 'typechecker.dart' show TypeCheckerTask;
73 import 'types/types.dart' show GlobalTypeInferenceTask; 73 import 'types/types.dart' show GlobalTypeInferenceTask;
74 import 'types/masks.dart' show CommonMasks; 74 import 'types/masks.dart' show CommonMasks;
75 import 'universe/selector.dart' show Selector; 75 import 'universe/selector.dart' show Selector;
76 import 'universe/world_builder.dart' 76 import 'universe/world_builder.dart'
77 show ResolutionWorldBuilder, CodegenWorldBuilder; 77 show ResolutionWorldBuilder, CodegenWorldBuilder;
78 import 'universe/use.dart' show StaticUse; 78 import 'universe/use.dart' show StaticUse;
79 import 'universe/world_impact.dart' show ImpactStrategy, WorldImpact, WorldImpac tBuilderImpl; 79 import 'universe/world_impact.dart'
80 show
81 ImpactStrategy,
82 WorldImpact,
83 WorldImpactBuilder,
84 WorldImpactBuilderImpl;
80 import 'util/util.dart' show Link, Setlet; 85 import 'util/util.dart' show Link, Setlet;
81 import 'world.dart' show ClosedWorld, ClosedWorldRefiner, OpenWorld, WorldImpl; 86 import 'world.dart' show ClosedWorld, ClosedWorldRefiner, OpenWorld, WorldImpl;
82 87
83 typedef Backend MakeBackendFuncion(Compiler compiler); 88 typedef Backend MakeBackendFuncion(Compiler compiler);
84 89
85 typedef CompilerDiagnosticReporter MakeReporterFunction( 90 typedef CompilerDiagnosticReporter MakeReporterFunction(
86 Compiler compiler, CompilerOptions options); 91 Compiler compiler, CompilerOptions options);
87 92
88 abstract class Compiler implements LibraryLoaderListener { 93 abstract class Compiler implements LibraryLoaderListener {
89 Measurer get measurer; 94 Measurer get measurer;
90 95
91 final IdGenerator idGenerator = new IdGenerator(); 96 final IdGenerator idGenerator = new IdGenerator();
92 WorldImpl _world; 97 WorldImpl get _world => resolverWorld.openWorld;
93 Types types; 98 Types types;
94 _CompilerCoreTypes _coreTypes; 99 _CompilerCoreTypes _coreTypes;
95 CompilerDiagnosticReporter _reporter; 100 CompilerDiagnosticReporter _reporter;
96 _CompilerResolution _resolution; 101 _CompilerResolution _resolution;
97 ParsingContext _parsingContext; 102 ParsingContext _parsingContext;
98 103
99 final CacheStrategy cacheStrategy; 104 final CacheStrategy cacheStrategy;
100 105
101 ImpactStrategy impactStrategy = const ImpactStrategy(); 106 ImpactStrategy impactStrategy = const ImpactStrategy();
102 107
(...skipping 29 matching lines...) Expand all
132 137
133 Tracer tracer; 138 Tracer tracer;
134 139
135 LibraryElement mainApp; 140 LibraryElement mainApp;
136 FunctionElement mainFunction; 141 FunctionElement mainFunction;
137 142
138 DiagnosticReporter get reporter => _reporter; 143 DiagnosticReporter get reporter => _reporter;
139 CommonElements get commonElements => _coreTypes; 144 CommonElements get commonElements => _coreTypes;
140 CoreClasses get coreClasses => _coreTypes; 145 CoreClasses get coreClasses => _coreTypes;
141 CoreTypes get coreTypes => _coreTypes; 146 CoreTypes get coreTypes => _coreTypes;
142 CommonMasks get commonMasks => globalInference.masks;
143 Resolution get resolution => _resolution; 147 Resolution get resolution => _resolution;
144 ParsingContext get parsingContext => _parsingContext; 148 ParsingContext get parsingContext => _parsingContext;
145 149
146 // TODO(zarah): Remove this map and incorporate compile-time errors 150 // TODO(zarah): Remove this map and incorporate compile-time errors
147 // in the model. 151 // in the model.
148 /// Tracks elements with compile-time errors. 152 /// Tracks elements with compile-time errors.
149 final Map<Element, List<DiagnosticMessage>> elementsWithCompileTimeErrors = 153 final Map<Element, List<DiagnosticMessage>> elementsWithCompileTimeErrors =
150 new Map<Element, List<DiagnosticMessage>>(); 154 new Map<Element, List<DiagnosticMessage>>();
151 155
152 final Environment environment; 156 final Environment environment;
(...skipping 24 matching lines...) Expand all
177 ConstantEnvironment constants; 181 ConstantEnvironment constants;
178 182
179 EnqueueTask enqueuer; 183 EnqueueTask enqueuer;
180 DeferredLoadTask deferredLoadTask; 184 DeferredLoadTask deferredLoadTask;
181 MirrorUsageAnalyzerTask mirrorUsageAnalyzerTask; 185 MirrorUsageAnalyzerTask mirrorUsageAnalyzerTask;
182 DumpInfoTask dumpInfoTask; 186 DumpInfoTask dumpInfoTask;
183 187
184 /// A customizable filter that is applied to enqueued work items. 188 /// A customizable filter that is applied to enqueued work items.
185 QueueFilter enqueuerFilter = new QueueFilter(); 189 QueueFilter enqueuerFilter = new QueueFilter();
186 190
187 bool enabledRuntimeType = false; 191 bool get hasFunctionApplySupport => resolverWorld.hasFunctionApplySupport;
188 bool enabledFunctionApply = false; 192 bool get hasIsolateSupport => resolverWorld.hasIsolateSupport;
189 bool enabledInvokeOn = false;
190 bool hasIsolateSupport = false;
191 193
192 bool get hasCrashed => _reporter.hasCrashed; 194 bool get hasCrashed => _reporter.hasCrashed;
193 195
194 Stopwatch progress; 196 Stopwatch progress;
195 197
196 bool get shouldPrintProgress { 198 bool get shouldPrintProgress {
197 return options.verbose && progress.elapsedMilliseconds > 500; 199 return options.verbose && progress.elapsedMilliseconds > 500;
198 } 200 }
199 201
200 static const int PHASE_SCANNING = 0; 202 static const int PHASE_SCANNING = 0;
201 static const int PHASE_RESOLVING = 1; 203 static const int PHASE_RESOLVING = 1;
202 static const int PHASE_DONE_RESOLVING = 2; 204 static const int PHASE_DONE_RESOLVING = 2;
203 static const int PHASE_COMPILING = 3; 205 static const int PHASE_COMPILING = 3;
204 int phase; 206 int phase;
205 207
206 bool compilationFailed = false; 208 bool compilationFailed = false;
207 209
208 Compiler( 210 Compiler(
209 {CompilerOptions options, 211 {CompilerOptions options,
210 api.CompilerOutput outputProvider, 212 api.CompilerOutput outputProvider,
211 this.environment: const _EmptyEnvironment(), 213 this.environment: const _EmptyEnvironment(),
212 MakeBackendFuncion makeBackend, 214 MakeBackendFuncion makeBackend,
213 MakeReporterFunction makeReporter}) 215 MakeReporterFunction makeReporter})
214 : this.options = options, 216 : this.options = options,
215 this.cacheStrategy = new CacheStrategy(options.hasIncrementalSupport), 217 this.cacheStrategy = new CacheStrategy(options.hasIncrementalSupport),
216 this.userOutputProvider = outputProvider == null 218 this.userOutputProvider = outputProvider == null
217 ? const NullCompilerOutput() 219 ? const NullCompilerOutput()
218 : outputProvider { 220 : outputProvider {
219 _world = new WorldImpl(this);
220 if (makeReporter != null) { 221 if (makeReporter != null) {
221 _reporter = makeReporter(this, options); 222 _reporter = makeReporter(this, options);
222 } else { 223 } else {
223 _reporter = new CompilerDiagnosticReporter(this, options); 224 _reporter = new CompilerDiagnosticReporter(this, options);
224 } 225 }
225 _resolution = new _CompilerResolution(this); 226 _resolution = new _CompilerResolution(this);
226 // TODO(johnniwinther): Initialize core types in [initializeCoreClasses] and 227 // TODO(johnniwinther): Initialize core types in [initializeCoreClasses] and
227 // make its field final. 228 // make its field final.
228 _coreTypes = new _CompilerCoreTypes(_resolution, reporter); 229 _coreTypes = new _CompilerCoreTypes(_resolution, reporter);
229 types = new Types(_resolution); 230 types = new Types(_resolution);
(...skipping 11 matching lines...) Expand all
241 backend = makeBackend(this); 242 backend = makeBackend(this);
242 } else { 243 } else {
243 js_backend.JavaScriptBackend jsBackend = new js_backend.JavaScriptBackend( 244 js_backend.JavaScriptBackend jsBackend = new js_backend.JavaScriptBackend(
244 this, 245 this,
245 generateSourceMap: options.generateSourceMap, 246 generateSourceMap: options.generateSourceMap,
246 useStartupEmitter: options.useStartupEmitter, 247 useStartupEmitter: options.useStartupEmitter,
247 useNewSourceInfo: options.useNewSourceInfo, 248 useNewSourceInfo: options.useNewSourceInfo,
248 useKernel: options.useKernel); 249 useKernel: options.useKernel);
249 backend = jsBackend; 250 backend = jsBackend;
250 } 251 }
252 enqueuer = backend.makeEnqueuer();
251 253
252 if (options.dumpInfo && options.useStartupEmitter) { 254 if (options.dumpInfo && options.useStartupEmitter) {
253 throw new ArgumentError( 255 throw new ArgumentError(
254 '--dump-info is not supported with the fast startup emitter'); 256 '--dump-info is not supported with the fast startup emitter');
255 } 257 }
256 258
257 tasks = [ 259 tasks = [
258 dietParser = 260 dietParser =
259 new DietParserTask(options, idGenerator, backend, reporter, measurer), 261 new DietParserTask(options, idGenerator, backend, reporter, measurer),
260 scanner = createScannerTask(), 262 scanner = createScannerTask(),
(...skipping 11 matching lines...) Expand all
272 measurer), 274 measurer),
273 parser = new ParserTask(this, options), 275 parser = new ParserTask(this, options),
274 patchParser = new PatchParserTask(this, options), 276 patchParser = new PatchParserTask(this, options),
275 resolver = createResolverTask(), 277 resolver = createResolverTask(),
276 closureToClassMapper = new closureMapping.ClosureTask(this), 278 closureToClassMapper = new closureMapping.ClosureTask(this),
277 checker = new TypeCheckerTask(this), 279 checker = new TypeCheckerTask(this),
278 globalInference = new GlobalTypeInferenceTask(this), 280 globalInference = new GlobalTypeInferenceTask(this),
279 constants = backend.constantCompilerTask, 281 constants = backend.constantCompilerTask,
280 deferredLoadTask = new DeferredLoadTask(this), 282 deferredLoadTask = new DeferredLoadTask(this),
281 mirrorUsageAnalyzerTask = new MirrorUsageAnalyzerTask(this), 283 mirrorUsageAnalyzerTask = new MirrorUsageAnalyzerTask(this),
282 enqueuer = backend.makeEnqueuer(), 284 // [enqueuer] is created earlier because it contains the resolution world
285 // objects needed by other tasks.
286 enqueuer,
283 dumpInfoTask = new DumpInfoTask(this), 287 dumpInfoTask = new DumpInfoTask(this),
284 selfTask = new GenericTask('self', measurer), 288 selfTask = new GenericTask('self', measurer),
285 ]; 289 ];
286 if (options.resolveOnly) { 290 if (options.resolveOnly) {
287 serialization.supportSerialization = true; 291 serialization.supportSerialization = true;
288 } 292 }
289 293
290 _parsingContext = 294 _parsingContext =
291 new ParsingContext(reporter, options, parser, patchParser, backend); 295 new ParsingContext(reporter, options, parser, patchParser, backend);
292 296
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 selfTask.measureSubtask("Compiler.compileLoadedLibraries", () { 643 selfTask.measureSubtask("Compiler.compileLoadedLibraries", () {
640 computeMain(); 644 computeMain();
641 645
642 mirrorUsageAnalyzerTask.analyzeUsage(mainApp); 646 mirrorUsageAnalyzerTask.analyzeUsage(mainApp);
643 647
644 // In order to see if a library is deferred, we must compute the 648 // In order to see if a library is deferred, we must compute the
645 // compile-time constants that are metadata. This means adding 649 // compile-time constants that are metadata. This means adding
646 // something to the resolution queue. So we cannot wait with 650 // something to the resolution queue. So we cannot wait with
647 // this until after the resolution queue is processed. 651 // this until after the resolution queue is processed.
648 deferredLoadTask.beforeResolution(this); 652 deferredLoadTask.beforeResolution(this);
649 impactStrategy = backend.createImpactStrategy( 653 ImpactStrategy impactStrategy = backend.createImpactStrategy(
650 supportDeferredLoad: deferredLoadTask.isProgramSplit, 654 supportDeferredLoad: deferredLoadTask.isProgramSplit,
651 supportDumpInfo: options.dumpInfo, 655 supportDumpInfo: options.dumpInfo,
652 supportSerialization: serialization.supportSerialization); 656 supportSerialization: serialization.supportSerialization);
653 657
654 phase = PHASE_RESOLVING; 658 phase = PHASE_RESOLVING;
655 if (options.resolveOnly) { 659 if (options.resolveOnly) {
656 libraryLoader.libraries.where((LibraryElement library) { 660 libraryLoader.libraries.where((LibraryElement library) {
657 return !serialization.isDeserialized(library); 661 return !serialization.isDeserialized(library);
658 }).forEach((LibraryElement library) { 662 }).forEach((LibraryElement library) {
659 reporter.log('Enqueuing ${library.canonicalUri}'); 663 reporter.log('Enqueuing ${library.canonicalUri}');
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 751
748 backend.sourceInformationStrategy.onComplete(); 752 backend.sourceInformationStrategy.onComplete();
749 753
750 checkQueues(); 754 checkQueues();
751 }); 755 });
752 756
753 /// Perform the steps needed to fully end the resolution phase. 757 /// Perform the steps needed to fully end the resolution phase.
754 void closeResolution() { 758 void closeResolution() {
755 phase = PHASE_DONE_RESOLVING; 759 phase = PHASE_DONE_RESOLVING;
756 760
757 openWorld.closeWorld(); 761 openWorld.closeWorld(reporter);
758 // Compute whole-program-knowledge that the backend needs. (This might 762 // Compute whole-program-knowledge that the backend needs. (This might
759 // require the information computed in [world.closeWorld].) 763 // require the information computed in [world.closeWorld].)
760 backend.onResolutionComplete(); 764 backend.onResolutionComplete();
761 765
762 deferredLoadTask.onResolutionComplete(mainFunction); 766 deferredLoadTask.onResolutionComplete(mainFunction);
763 767
764 // TODO(johnniwinther): Move this after rti computation but before 768 // TODO(johnniwinther): Move this after rti computation but before
765 // reflection members computation, and (re-)close the world afterwards. 769 // reflection members computation, and (re-)close the world afterwards.
766 closureToClassMapper.createClosureClasses(); 770 closureToClassMapper.createClosureClasses();
767 } 771 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 for (LibraryElement library in libraryLoader.libraries) { 823 for (LibraryElement library in libraryLoader.libraries) {
820 if (library.metadata != null) { 824 if (library.metadata != null) {
821 for (MetadataAnnotation metadata in library.metadata) { 825 for (MetadataAnnotation metadata in library.metadata) {
822 metadata.ensureResolved(resolution); 826 metadata.ensureResolved(resolution);
823 } 827 }
824 } 828 }
825 } 829 }
826 } 830 }
827 831
828 /** 832 /**
829 * Empty the [world] queue. 833 * Empty the [enqueuer] queue.
830 */ 834 */
831 void emptyQueue(Enqueuer world) => 835 void emptyQueue(Enqueuer enqueuer) {
832 selfTask.measureSubtask("Compiler.emptyQueue", () { 836 selfTask.measureSubtask("Compiler.emptyQueue", () {
833 world.forEach((WorkItem work) { 837 enqueuer.forEach((WorkItem work) {
834 reporter.withCurrentElement( 838 reporter.withCurrentElement(
835 work.element, 839 work.element,
836 () => selfTask.measureSubtask("world.applyImpact", () { 840 () => selfTask.measureSubtask("world.applyImpact", () {
837 world.applyImpact( 841 enqueuer.applyImpact(
838 selfTask.measureSubtask( 842 impactStrategy,
839 "work.run", () => work.run(this, world)), 843 selfTask.measureSubtask(
840 impactSource: work.element); 844 "work.run", () => work.run(this, enqueuer)),
841 })); 845 impactSource: work.element);
842 }); 846 }));
843 }); 847 });
848 });
849 }
844 850
845 void processQueue(Enqueuer enqueuer, Element main) { 851 void processQueue(Enqueuer enqueuer, Element main) {
846 selfTask.measureSubtask("Compiler.processQueue", () { 852 selfTask.measureSubtask("Compiler.processQueue", () {
847 WorldImpactBuilderImpl nativeImpact = new WorldImpactBuilderImpl(); 853 WorldImpactBuilderImpl nativeImpact = new WorldImpactBuilderImpl();
848 enqueuer.nativeEnqueuer 854 enqueuer.nativeEnqueuer
849 .processNativeClasses(nativeImpact, libraryLoader.libraries); 855 .processNativeClasses(nativeImpact, libraryLoader.libraries);
850 enqueuer.applyImpact(nativeImpact); 856 enqueuer.applyImpact(impactStrategy, nativeImpact);
851 if (main != null && !main.isMalformed) { 857 if (main != null && !main.isMalformed) {
852 FunctionElement mainMethod = main; 858 FunctionElement mainMethod = main;
853 mainMethod.computeType(resolution); 859 mainMethod.computeType(resolution);
854 if (mainMethod.functionSignature.parameterCount != 0) { 860 if (mainMethod.functionSignature.parameterCount != 0) {
855 // The first argument could be a list of strings. 861 // The first argument could be a list of strings.
856 backend.backendClasses.listImplementation.ensureResolved(resolution); 862 backend.backendClasses.listImplementation.ensureResolved(resolution);
857 enqueuer.registerInstantiatedType( 863 enqueuer.registerInstantiatedType(
858 backend.backendClasses.listImplementation.rawType); 864 backend.backendClasses.listImplementation.rawType);
859 backend.backendClasses.stringImplementation 865 backend.backendClasses.stringImplementation
860 .ensureResolved(resolution); 866 .ensureResolved(resolution);
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after
2031 2037
2032 @override 2038 @override
2033 void ensureResolved(Element element) { 2039 void ensureResolved(Element element) {
2034 if (compiler.serialization.isDeserialized(element)) { 2040 if (compiler.serialization.isDeserialized(element)) {
2035 return; 2041 return;
2036 } 2042 }
2037 computeWorldImpact(element); 2043 computeWorldImpact(element);
2038 } 2044 }
2039 2045
2040 @override 2046 @override
2047 void ensureClassMembers(ClassElement element) {
2048 if (!compiler.serialization.isDeserialized(element)) {
2049 compiler.resolver.checkClass(element);
2050 }
2051 }
2052
2053 @override
2041 void registerCompileTimeError(Element element, DiagnosticMessage message) => 2054 void registerCompileTimeError(Element element, DiagnosticMessage message) =>
2042 compiler.registerCompileTimeError(element, message); 2055 compiler.registerCompileTimeError(element, message);
2043 2056
2044 @override 2057 @override
2045 bool hasResolvedAst(ExecutableElement element) { 2058 bool hasResolvedAst(ExecutableElement element) {
2046 assert(invariant(element, element.isDeclaration, 2059 assert(invariant(element, element.isDeclaration,
2047 message: "Element $element must be the declaration.")); 2060 message: "Element $element must be the declaration."));
2048 if (compiler.serialization.isDeserialized(element)) { 2061 if (compiler.serialization.isDeserialized(element)) {
2049 return compiler.serialization.hasResolvedAst(element); 2062 return compiler.serialization.hasResolvedAst(element);
2050 } 2063 }
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
2131 compiler.checker.check(element); 2144 compiler.checker.check(element);
2132 } 2145 }
2133 return transformResolutionImpact(element, resolutionImpact); 2146 return transformResolutionImpact(element, resolutionImpact);
2134 }); 2147 });
2135 } 2148 }
2136 2149
2137 @override 2150 @override
2138 WorldImpact transformResolutionImpact( 2151 WorldImpact transformResolutionImpact(
2139 Element element, ResolutionImpact resolutionImpact) { 2152 Element element, ResolutionImpact resolutionImpact) {
2140 WorldImpact worldImpact = compiler.backend.impactTransformer 2153 WorldImpact worldImpact = compiler.backend.impactTransformer
2141 .transformResolutionImpact(compiler.enqueuer.resolution, resolutionImpac t); 2154 .transformResolutionImpact(
2155 compiler.enqueuer.resolution, resolutionImpact);
2142 _worldImpactCache[element] = worldImpact; 2156 _worldImpactCache[element] = worldImpact;
2143 return worldImpact; 2157 return worldImpact;
2144 } 2158 }
2145 2159
2146 @override 2160 @override
2147 void uncacheWorldImpact(Element element) { 2161 void uncacheWorldImpact(Element element) {
2148 assert(invariant(element, element.isDeclaration, 2162 assert(invariant(element, element.isDeclaration,
2149 message: "Element $element must be the declaration.")); 2163 message: "Element $element must be the declaration."));
2150 if (retainCachesForTesting) return; 2164 if (retainCachesForTesting) return;
2151 if (compiler.serialization.isDeserialized(element)) return; 2165 if (compiler.serialization.isDeserialized(element)) return;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2244 _ElementScanner(this.scanner); 2258 _ElementScanner(this.scanner);
2245 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library); 2259 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library);
2246 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit); 2260 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit);
2247 } 2261 }
2248 2262
2249 class _EmptyEnvironment implements Environment { 2263 class _EmptyEnvironment implements Environment {
2250 const _EmptyEnvironment(); 2264 const _EmptyEnvironment();
2251 2265
2252 String valueOf(String key) => null; 2266 String valueOf(String key) => null;
2253 } 2267 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/common/resolution.dart ('k') | pkg/compiler/lib/src/dump_info.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698