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

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

Issue 2265473004: Introduce "CommonElements" (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: cl Created 4 years, 4 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
« no previous file with comments | « pkg/compiler/lib/src/compile_time_constants.dart ('k') | pkg/compiler/lib/src/core_types.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;
11 import 'closure.dart' as closureMapping show ClosureTask; 11 import 'closure.dart' as closureMapping show ClosureTask;
12 import 'common/backend_api.dart' show Backend; 12 import 'common/backend_api.dart' show Backend;
13 import 'common/codegen.dart' show CodegenWorkItem; 13 import 'common/codegen.dart' show CodegenWorkItem;
14 import 'common/names.dart' show Selectors; 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 18 show
19 ParsingContext, 19 ParsingContext,
20 Resolution, 20 Resolution,
21 ResolutionWorkItem, 21 ResolutionWorkItem,
22 ResolutionImpact, 22 ResolutionImpact,
23 Target; 23 Target;
24 import 'common/tasks.dart' show CompilerTask, GenericTask, Measurer; 24 import 'common/tasks.dart' show CompilerTask, GenericTask, Measurer;
25 import 'common/work.dart' show ItemCompilationContext, WorkItem; 25 import 'common/work.dart' show ItemCompilationContext, WorkItem;
26 import 'common.dart'; 26 import 'common.dart';
27 import 'compile_time_constants.dart'; 27 import 'compile_time_constants.dart';
28 import 'constants/values.dart'; 28 import 'constants/values.dart';
29 import 'core_types.dart' show CoreClasses, CoreTypes; 29 import 'core_types.dart' show CoreClasses, CommonElements, CoreTypes;
30 import 'dart_types.dart' show DartType, DynamicType, InterfaceType, Types; 30 import 'dart_types.dart' show DartType, DynamicType, InterfaceType, Types;
31 import 'deferred_load.dart' show DeferredLoadTask; 31 import 'deferred_load.dart' show DeferredLoadTask;
32 import 'diagnostics/code_location.dart'; 32 import 'diagnostics/code_location.dart';
33 import 'diagnostics/diagnostic_listener.dart' show DiagnosticReporter; 33 import 'diagnostics/diagnostic_listener.dart' show DiagnosticReporter;
34 import 'diagnostics/invariant.dart' show REPORT_EXCESS_RESOLUTION; 34 import 'diagnostics/invariant.dart' show REPORT_EXCESS_RESOLUTION;
35 import 'diagnostics/messages.dart' show Message, MessageTemplate; 35 import 'diagnostics/messages.dart' show Message, MessageTemplate;
36 import 'dump_info.dart' show DumpInfoTask; 36 import 'dump_info.dart' show DumpInfoTask;
37 import 'elements/elements.dart'; 37 import 'elements/elements.dart';
38 import 'elements/modelx.dart' show ErroneousElementX; 38 import 'elements/modelx.dart' show ErroneousElementX;
39 import 'enqueue.dart' 39 import 'enqueue.dart'
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 138
139 /// Output provider from user of Compiler API. 139 /// Output provider from user of Compiler API.
140 api.CompilerOutput userOutputProvider; 140 api.CompilerOutput userOutputProvider;
141 141
142 List<Uri> librariesToAnalyzeWhenRun; 142 List<Uri> librariesToAnalyzeWhenRun;
143 143
144 ResolvedUriTranslator get resolvedUriTranslator; 144 ResolvedUriTranslator get resolvedUriTranslator;
145 145
146 Tracer tracer; 146 Tracer tracer;
147 147
148 LibraryElement coreLibrary;
149 LibraryElement asyncLibrary;
150
151 LibraryElement mainApp; 148 LibraryElement mainApp;
152 FunctionElement mainFunction; 149 FunctionElement mainFunction;
153 150
154 /// Initialized when dart:mirrors is loaded.
155 LibraryElement mirrorsLibrary;
156
157 /// Initialized when dart:typed_data is loaded.
158 LibraryElement typedDataLibrary;
159
160 DiagnosticReporter get reporter => _reporter; 151 DiagnosticReporter get reporter => _reporter;
152 CommonElements get commonElements => _coreTypes;
161 CoreClasses get coreClasses => _coreTypes; 153 CoreClasses get coreClasses => _coreTypes;
162 CoreTypes get coreTypes => _coreTypes; 154 CoreTypes get coreTypes => _coreTypes;
163 Resolution get resolution => _resolution; 155 Resolution get resolution => _resolution;
164 ParsingContext get parsingContext => _parsingContext; 156 ParsingContext get parsingContext => _parsingContext;
165 157
166 ClassElement typedDataClass;
167
168 // TODO(johnniwinther): Move this to the JavaScriptBackend.
169 /// The class for patch annotation defined in dart:_js_helper.
170 ClassElement patchAnnotationClass;
171
172 // TODO(johnniwinther): Move this to the JavaScriptBackend.
173 ClassElement nativeAnnotationClass;
174
175 ConstructorElement _symbolConstructor;
176 ConstructorElement get symbolConstructor {
177 if (_symbolConstructor == null) {
178 ClassElement symbolClass = coreClasses.symbolClass;
179 symbolClass.ensureResolved(resolution);
180 _symbolConstructor = symbolClass.lookupConstructor('');
181 assert(invariant(symbolClass, _symbolConstructor != null,
182 message: "Default constructor not found ${symbolClass}."));
183 }
184 return _symbolConstructor;
185 }
186
187 // Initialized when dart:mirrors is loaded.
188 ClassElement mirrorSystemClass;
189
190 // Initialized when dart:mirrors is loaded.
191 ClassElement mirrorsUsedClass;
192
193 // Initialized after mirrorSystemClass has been resolved.
194 FunctionElement mirrorSystemGetNameFunction;
195
196 // Initialized when mirrorsUsedClass has been resolved.
197 FunctionElement mirrorsUsedConstructor;
198
199 // Initialized when dart:mirrors is loaded.
200 ClassElement deferredLibraryClass;
201
202 Element identicalFunction;
203 Element loadLibraryFunction;
204 Element functionApplyMethod;
205
206 // TODO(zarah): Remove this map and incorporate compile-time errors 158 // TODO(zarah): Remove this map and incorporate compile-time errors
207 // in the model. 159 // in the model.
208 /// Tracks elements with compile-time errors. 160 /// Tracks elements with compile-time errors.
209 final Map<Element, List<DiagnosticMessage>> elementsWithCompileTimeErrors = 161 final Map<Element, List<DiagnosticMessage>> elementsWithCompileTimeErrors =
210 new Map<Element, List<DiagnosticMessage>>(); 162 new Map<Element, List<DiagnosticMessage>>();
211 163
212 final Environment environment; 164 final Environment environment;
213 // TODO(sigmund): delete once we migrate the rest of the compiler to use 165 // TODO(sigmund): delete once we migrate the rest of the compiler to use
214 // `environment` directly. 166 // `environment` directly.
215 @deprecated 167 @deprecated
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 : outputProvider { 230 : outputProvider {
279 world = new World(this); 231 world = new World(this);
280 if (makeReporter != null) { 232 if (makeReporter != null) {
281 _reporter = makeReporter(this, options); 233 _reporter = makeReporter(this, options);
282 } else { 234 } else {
283 _reporter = new CompilerDiagnosticReporter(this, options); 235 _reporter = new CompilerDiagnosticReporter(this, options);
284 } 236 }
285 _resolution = new _CompilerResolution(this); 237 _resolution = new _CompilerResolution(this);
286 // TODO(johnniwinther): Initialize core types in [initializeCoreClasses] and 238 // TODO(johnniwinther): Initialize core types in [initializeCoreClasses] and
287 // make its field final. 239 // make its field final.
288 _coreTypes = new _CompilerCoreTypes(_resolution); 240 _coreTypes = new _CompilerCoreTypes(_resolution, reporter);
289 types = new Types(_resolution); 241 types = new Types(_resolution);
290 tracer = new Tracer(this, this.outputProvider); 242 tracer = new Tracer(this, this.outputProvider);
291 243
292 if (options.verbose) { 244 if (options.verbose) {
293 progress = new Stopwatch()..start(); 245 progress = new Stopwatch()..start();
294 } 246 }
295 247
296 // TODO(johnniwinther): Separate the dependency tracking from the enqueuing 248 // TODO(johnniwinther): Separate the dependency tracking from the enqueuing
297 // for global dependencies. 249 // for global dependencies.
298 globalDependencies = new GlobalDependencyRegistry(this); 250 globalDependencies = new GlobalDependencyRegistry(this);
(...skipping 15 matching lines...) Expand all
314 } 266 }
315 267
316 tasks = [ 268 tasks = [
317 dietParser = 269 dietParser =
318 new DietParserTask(options, idGenerator, backend, reporter, measurer), 270 new DietParserTask(options, idGenerator, backend, reporter, measurer),
319 scanner = createScannerTask(), 271 scanner = createScannerTask(),
320 serialization = new SerializationTask(this), 272 serialization = new SerializationTask(this),
321 libraryLoader = new LibraryLoaderTask( 273 libraryLoader = new LibraryLoaderTask(
322 resolvedUriTranslator, 274 resolvedUriTranslator,
323 options.compileOnly 275 options.compileOnly
324 ? new _NoScriptLoader(this) : new _ScriptLoader(this), 276 ? new _NoScriptLoader(this)
277 : new _ScriptLoader(this),
325 new _ElementScanner(scanner), 278 new _ElementScanner(scanner),
326 serialization, 279 serialization,
327 this, 280 this,
328 environment, 281 environment,
329 reporter, 282 reporter,
330 measurer), 283 measurer),
331 parser = new ParserTask(this, options), 284 parser = new ParserTask(this, options),
332 patchParser = new PatchParserTask(this, options), 285 patchParser = new PatchParserTask(this, options),
333 resolver = createResolverTask(), 286 resolver = createResolverTask(),
334 closureToClassMapper = new closureMapping.ClosureTask(this), 287 closureToClassMapper = new closureMapping.ClosureTask(this),
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 }); 352 });
400 }); 353 });
401 354
402 /// This method is called immediately after the [LibraryElement] [library] has 355 /// This method is called immediately after the [LibraryElement] [library] has
403 /// been created. 356 /// been created.
404 /// 357 ///
405 /// Use this callback method to store references to specific libraries. 358 /// Use this callback method to store references to specific libraries.
406 /// Note that [library] has not been scanned yet, nor has its imports/exports 359 /// Note that [library] has not been scanned yet, nor has its imports/exports
407 /// been resolved. 360 /// been resolved.
408 void onLibraryCreated(LibraryElement library) { 361 void onLibraryCreated(LibraryElement library) {
409 Uri uri = library.canonicalUri; 362 _coreTypes.onLibraryCreated(library);
410 if (uri == Uris.dart_core) {
411 coreLibrary = library;
412 } else if (uri == Uris.dart__native_typed_data) {
413 typedDataLibrary = library;
414 } else if (uri == Uris.dart_mirrors) {
415 mirrorsLibrary = library;
416 }
417 backend.onLibraryCreated(library); 363 backend.onLibraryCreated(library);
418 } 364 }
419 365
420 /// This method is called immediately after the [library] and its parts have 366 /// This method is called immediately after the [library] and its parts have
421 /// been scanned. 367 /// been scanned.
422 /// 368 ///
423 /// Use this callback method to store references to specific member declared 369 /// Use this callback method to store references to specific member declared
424 /// in certain libraries. Note that [library] has not been patched yet, nor 370 /// in certain libraries. Note that [library] has not been patched yet, nor
425 /// has its imports/exports been resolved. 371 /// has its imports/exports been resolved.
426 /// 372 ///
427 /// Use [loader] to register the creation and scanning of a patch library 373 /// Use [loader] to register the creation and scanning of a patch library
428 /// for [library]. 374 /// for [library].
429 Future onLibraryScanned(LibraryElement library, LibraryLoader loader) { 375 Future onLibraryScanned(LibraryElement library, LibraryLoader loader) {
430 Uri uri = library.canonicalUri;
431 // If the script of the library is synthesized, the library does not exist
432 // and we do not try to load the helpers.
433 //
434 // This could for example happen if dart:async is disabled, then loading it
435 // should not try to find the given element.
436 if (!library.isSynthesized) {
437 if (uri == Uris.dart_core) {
438 initializeCoreClasses();
439 identicalFunction = coreLibrary.find('identical');
440 } else if (uri == Uris.dart_mirrors) {
441 mirrorSystemClass = findRequiredElement(library, 'MirrorSystem');
442 mirrorsUsedClass = findRequiredElement(library, 'MirrorsUsed');
443 } else if (uri == Uris.dart_async) {
444 asyncLibrary = library;
445 deferredLibraryClass = findRequiredElement(library, 'DeferredLibrary');
446 _coreTypes.futureClass = findRequiredElement(library, 'Future');
447 _coreTypes.streamClass = findRequiredElement(library, 'Stream');
448 } else if (uri == Uris.dart__native_typed_data) {
449 typedDataClass = findRequiredElement(library, 'NativeTypedData');
450 } else if (uri == js_backend.BackendHelpers.DART_JS_HELPER) {
451 patchAnnotationClass = findRequiredElement(library, '_Patch');
452 nativeAnnotationClass = findRequiredElement(library, 'Native');
453 }
454 }
455 return backend.onLibraryScanned(library, loader); 376 return backend.onLibraryScanned(library, loader);
456 } 377 }
457 378
458 /// Compute the set of distinct import chains to the library at [uri] within 379 /// Compute the set of distinct import chains to the library at [uri] within
459 /// [loadedLibraries]. 380 /// [loadedLibraries].
460 /// 381 ///
461 /// The chains are strings of the form 382 /// The chains are strings of the form
462 /// 383 ///
463 /// <main-uri> => <intermediate-uri1> => <intermediate-uri2> => <uri> 384 /// <main-uri> => <intermediate-uri1> => <intermediate-uri2> => <uri>
464 /// 385 ///
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 }); 472 });
552 } else if (importsMirrorsLibrary && !options.enableExperimentalMirrors) { 473 } else if (importsMirrorsLibrary && !options.enableExperimentalMirrors) {
553 Set<String> importChains = 474 Set<String> importChains =
554 computeImportChainsFor(loadedLibraries, Uris.dart_mirrors); 475 computeImportChainsFor(loadedLibraries, Uris.dart_mirrors);
555 reporter.reportWarningMessage( 476 reporter.reportWarningMessage(
556 NO_LOCATION_SPANNABLE, MessageKind.IMPORT_EXPERIMENTAL_MIRRORS, { 477 NO_LOCATION_SPANNABLE, MessageKind.IMPORT_EXPERIMENTAL_MIRRORS, {
557 'importChain': importChains 478 'importChain': importChains
558 .join(MessageTemplate.IMPORT_EXPERIMENTAL_MIRRORS_PADDING) 479 .join(MessageTemplate.IMPORT_EXPERIMENTAL_MIRRORS_PADDING)
559 }); 480 });
560 } 481 }
561
562 coreClasses.functionClass.ensureResolved(resolution);
563 functionApplyMethod =
564 coreClasses.functionClass.lookupLocalMember('apply');
565 }).then((_) => backend.onLibrariesLoaded(loadedLibraries)); 482 }).then((_) => backend.onLibrariesLoaded(loadedLibraries));
566 } 483 }
567 484
568 Element findRequiredElement(LibraryElement library, String name) {
569 var element = library.find(name);
570 if (element == null) {
571 reporter.internalError(
572 library,
573 "The library '${library.canonicalUri}' does not contain required "
574 "element: '$name'.");
575 }
576 return element;
577 }
578
579 // TODO(johnniwinther): Move this to [PatchParser] when it is moved to the 485 // TODO(johnniwinther): Move this to [PatchParser] when it is moved to the
580 // [JavaScriptBackend]. Currently needed for testing. 486 // [JavaScriptBackend]. Currently needed for testing.
581 String get patchVersion => backend.patchVersion; 487 String get patchVersion => backend.patchVersion;
582 488
583 // TODO(johnniwinther): Remove this. All elements should be looked up on
584 // demand.
585 void onClassResolved(ClassElement cls) {
586 if (mirrorSystemClass == cls) {
587 mirrorSystemGetNameFunction = cls.lookupLocalMember('getName');
588 } else if (mirrorsUsedClass == cls) {
589 mirrorsUsedConstructor = cls.constructors.head;
590 }
591 }
592
593 void initializeCoreClasses() {
594 final List missingCoreClasses = [];
595 ClassElement lookupCoreClass(String name) {
596 ClassElement result = coreLibrary.find(name);
597 if (result == null) {
598 missingCoreClasses.add(name);
599 }
600 return result;
601 }
602
603 _coreTypes.objectClass = lookupCoreClass('Object');
604 _coreTypes.boolClass = lookupCoreClass('bool');
605 _coreTypes.numClass = lookupCoreClass('num');
606 _coreTypes.intClass = lookupCoreClass('int');
607 _coreTypes.doubleClass = lookupCoreClass('double');
608 _coreTypes.resourceClass = lookupCoreClass('Resource');
609 _coreTypes.stringClass = lookupCoreClass('String');
610 _coreTypes.functionClass = lookupCoreClass('Function');
611 _coreTypes.listClass = lookupCoreClass('List');
612 _coreTypes.typeClass = lookupCoreClass('Type');
613 _coreTypes.mapClass = lookupCoreClass('Map');
614 _coreTypes.nullClass = lookupCoreClass('Null');
615 _coreTypes.stackTraceClass = lookupCoreClass('StackTrace');
616 _coreTypes.iterableClass = lookupCoreClass('Iterable');
617 _coreTypes.symbolClass = lookupCoreClass('Symbol');
618 if (!missingCoreClasses.isEmpty) {
619 reporter.internalError(
620 coreLibrary,
621 'dart:core library does not contain required classes: '
622 '$missingCoreClasses');
623 }
624 }
625
626 Element _unnamedListConstructor; 489 Element _unnamedListConstructor;
627 Element get unnamedListConstructor { 490 Element get unnamedListConstructor {
628 if (_unnamedListConstructor != null) return _unnamedListConstructor; 491 if (_unnamedListConstructor != null) return _unnamedListConstructor;
629 return _unnamedListConstructor = 492 return _unnamedListConstructor =
630 coreClasses.listClass.lookupDefaultConstructor(); 493 coreClasses.listClass.lookupDefaultConstructor();
631 } 494 }
632 495
633 Element _filledListConstructor; 496 Element _filledListConstructor;
634 Element get filledListConstructor { 497 Element get filledListConstructor {
635 if (_filledListConstructor != null) return _filledListConstructor; 498 if (_filledListConstructor != null) return _filledListConstructor;
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 return userOutputProvider.createEventSink(name, extension); 1155 return userOutputProvider.createEventSink(name, extension);
1293 } 1156 }
1294 } 1157 }
1295 1158
1296 /// Information about suppressed warnings and hints for a given library. 1159 /// Information about suppressed warnings and hints for a given library.
1297 class SuppressionInfo { 1160 class SuppressionInfo {
1298 int warnings = 0; 1161 int warnings = 0;
1299 int hints = 0; 1162 int hints = 0;
1300 } 1163 }
1301 1164
1302 class _CompilerCoreTypes implements CoreTypes, CoreClasses { 1165 class _CompilerCoreTypes implements CoreTypes, CoreClasses, CommonElements {
1303 final Resolution resolution; 1166 final Resolution resolution;
1167 final DiagnosticReporter reporter;
1304 1168
1305 ClassElement objectClass; 1169 LibraryElement coreLibrary;
1306 ClassElement boolClass; 1170 LibraryElement asyncLibrary;
1307 ClassElement numClass; 1171 LibraryElement mirrorsLibrary;
1308 ClassElement intClass; 1172 LibraryElement typedDataLibrary;
1309 ClassElement doubleClass;
1310 ClassElement stringClass;
1311 ClassElement functionClass;
1312 ClassElement nullClass;
1313 ClassElement listClass;
1314 ClassElement typeClass;
1315 ClassElement mapClass;
1316 ClassElement symbolClass;
1317 ClassElement stackTraceClass;
1318 ClassElement futureClass;
1319 ClassElement iterableClass;
1320 ClassElement streamClass;
1321 ClassElement resourceClass;
1322 1173
1323 _CompilerCoreTypes(this.resolution); 1174 // TODO(sigmund): possibly move this to target-specific collection of
1175 // elements, or refactor the library so that the helpers we need are in a
1176 // target-agnostic place. Currently we are using @patch and @Native from
1177 // here. We hope we can make those independent of the backend and generic
1178 // enough so the patching algorithm can work without being configured for a
1179 // specific backend.
1180 LibraryElement jsHelperLibrary;
1181
1182 _CompilerCoreTypes(this.resolution, this.reporter);
1183
1184 // From dart:core
1185
1186 ClassElement _objectClass;
1187 ClassElement get objectClass =>
1188 _objectClass ??= _findRequired(coreLibrary, 'Object');
1189
1190 ClassElement _boolClass;
1191 ClassElement get boolClass =>
1192 _boolClass ??= _findRequired(coreLibrary, 'bool');
1193
1194 ClassElement _numClass;
1195 ClassElement get numClass => _numClass ??= _findRequired(coreLibrary, 'num');
1196
1197 ClassElement _intClass;
1198 ClassElement get intClass => _intClass ??= _findRequired(coreLibrary, 'int');
1199
1200 ClassElement _doubleClass;
1201 ClassElement get doubleClass =>
1202 _doubleClass ??= _findRequired(coreLibrary, 'double');
1203
1204 ClassElement _stringClass;
1205 ClassElement get stringClass =>
1206 _stringClass ??= _findRequired(coreLibrary, 'String');
1207
1208 ClassElement _functionClass;
1209 ClassElement get functionClass =>
1210 _functionClass ??= _findRequired(coreLibrary, 'Function');
1211
1212 Element _functionApplyMethod;
1213 Element get functionApplyMethod {
1214 if (_functionApplyMethod == null) {
1215 functionClass.ensureResolved(resolution);
1216 _functionApplyMethod = functionClass.lookupLocalMember('apply');
1217 assert(invariant(functionClass, _functionApplyMethod != null,
1218 message: "Member `apply` not found in ${functionClass}."));
1219 }
1220 return _functionApplyMethod;
1221 }
1222
1223 bool isFunctionApplyMethod(Element element) =>
1224 element.name == 'apply' && element.enclosingClass == functionClass;
1225
1226 ClassElement _nullClass;
1227 ClassElement get nullClass =>
1228 _nullClass ??= _findRequired(coreLibrary, 'Null');
1229
1230 ClassElement _listClass;
1231 ClassElement get listClass =>
1232 _listClass ??= _findRequired(coreLibrary, 'List');
1233
1234 ClassElement _typeClass;
1235 ClassElement get typeClass =>
1236 _typeClass ??= _findRequired(coreLibrary, 'Type');
1237
1238 ClassElement _mapClass;
1239 ClassElement get mapClass => _mapClass ??= _findRequired(coreLibrary, 'Map');
1240
1241 ClassElement _symbolClass;
1242 ClassElement get symbolClass =>
1243 _symbolClass ??= _findRequired(coreLibrary, 'Symbol');
1244
1245 ConstructorElement _symbolConstructor;
1246 ConstructorElement get symbolConstructor {
1247 if (_symbolConstructor == null) {
1248 symbolClass.ensureResolved(resolution);
1249 _symbolConstructor = symbolClass.lookupConstructor('');
1250 assert(invariant(symbolClass, _symbolConstructor != null,
1251 message: "Default constructor not found ${symbolClass}."));
1252 }
1253 return _symbolConstructor;
1254 }
1255
1256 bool isSymbolConstructor(Element e) =>
1257 e.enclosingClass == symbolClass && e == symbolConstructor;
1258
1259 ClassElement _stackTraceClass;
1260 ClassElement get stackTraceClass =>
1261 _stackTraceClass ??= _findRequired(coreLibrary, 'StackTrace');
1262
1263 ClassElement _iterableClass;
1264 ClassElement get iterableClass =>
1265 _iterableClass ??= _findRequired(coreLibrary, 'Iterable');
1266
1267 ClassElement _resourceClass;
1268 ClassElement get resourceClass =>
1269 _resourceClass ??= _findRequired(coreLibrary, 'Resource');
1270
1271 Element _identicalFunction;
1272 Element get identicalFunction =>
1273 _identicalFunction ??= coreLibrary.find('identical');
1274
1275 // From dart:async
1276
1277 ClassElement _futureClass;
1278 ClassElement get futureClass =>
1279 _futureClass ??= _findRequired(asyncLibrary, 'Future');
1280
1281 ClassElement _streamClass;
1282 ClassElement get streamClass =>
1283 _streamClass ??= _findRequired(asyncLibrary, 'Stream');
1284
1285 ClassElement _deferredLibraryClass;
1286 ClassElement get deferredLibraryClass =>
1287 _deferredLibraryClass ??= _findRequired(asyncLibrary, "DeferredLibrary");
1288
1289 // From dart:mirrors
1290
1291 ClassElement _mirrorSystemClass;
1292 ClassElement get mirrorSystemClass =>
1293 _mirrorSystemClass ??= _findRequired(mirrorsLibrary, 'MirrorSystem');
1294
1295 FunctionElement _mirrorSystemGetNameFunction;
1296 bool isMirrorSystemGetNameFunction(Element element) {
1297 if (_mirrorSystemGetNameFunction == null) {
1298 if (!element.isFunction || mirrorsLibrary == null) return false;
1299 ClassElement cls = mirrorSystemClass;
1300 if (element.enclosingClass != cls) return false;
1301 if (cls != null) {
1302 cls.ensureResolved(resolution);
1303 _mirrorSystemGetNameFunction = cls.lookupLocalMember('getName');
1304 }
1305 }
1306 return element == _mirrorSystemGetNameFunction;
1307 }
1308
1309 ClassElement _mirrorsUsedClass;
1310 ClassElement get mirrorsUsedClass =>
1311 _mirrorsUsedClass ??= _findRequired(mirrorsLibrary, 'MirrorsUsed');
1312
1313 bool isMirrorsUsedConstructor(ConstructorElement element) =>
1314 mirrorsLibrary != null && mirrorsUsedClass == element.enclosingClass;
1315
1316 ConstructorElement _mirrorsUsedConstructor;
1317 @override
1318 ConstructorElement get mirrorsUsedConstructor {
1319 if (_mirrorsUsedConstructor == null) {
1320 ClassElement cls = mirrorsUsedClass;
1321 if (cls != null) {
1322 cls.ensureResolved(resolution);
1323 _mirrorsUsedConstructor = cls.constructors.head;
1324 }
1325 }
1326 return _mirrorsUsedConstructor;
1327 }
1328
1329 // From dart:typed_data
1330
1331 ClassElement _typedDataClass;
1332 ClassElement get typedDataClass =>
1333 _typedDataClass ??= _findRequired(typedDataLibrary, 'NativeTypedData');
1334
1335 // From dart:_js_helper
1336 // TODO(sigmund,johnniwinther): refactor needed: either these move to a
1337 // backend-specific collection of helpers, or the helper code moves to a
1338 // backend agnostic library (see commend above on [jsHelperLibrary].
1339
1340 ClassElement _patchAnnotationClass;
1341 ClassElement get patchAnnotationClass =>
1342 _patchAnnotationClass ??= _findRequired(jsHelperLibrary, '_Patch');
1343
1344 ClassElement _nativeAnnotationClass;
1345 ClassElement get nativeAnnotationClass =>
1346 _nativeAnnotationClass ??= _findRequired(jsHelperLibrary, 'Native');
1324 1347
1325 @override 1348 @override
1326 InterfaceType get objectType { 1349 InterfaceType get objectType {
1327 objectClass.ensureResolved(resolution); 1350 objectClass.ensureResolved(resolution);
1328 return objectClass.rawType; 1351 return objectClass.rawType;
1329 } 1352 }
1330 1353
1331 @override 1354 @override
1332 InterfaceType get boolType { 1355 InterfaceType get boolType {
1333 boolClass.ensureResolved(resolution); 1356 boolClass.ensureResolved(resolution);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1440 1463
1441 @override 1464 @override
1442 InterfaceType streamType([DartType elementType]) { 1465 InterfaceType streamType([DartType elementType]) {
1443 streamClass.ensureResolved(resolution); 1466 streamClass.ensureResolved(resolution);
1444 InterfaceType type = streamClass.rawType; 1467 InterfaceType type = streamClass.rawType;
1445 if (elementType == null) { 1468 if (elementType == null) {
1446 return type; 1469 return type;
1447 } 1470 }
1448 return type.createInstantiation([elementType]); 1471 return type.createInstantiation([elementType]);
1449 } 1472 }
1473
1474 void onLibraryCreated(LibraryElement library) {
1475 Uri uri = library.canonicalUri;
1476 if (uri == Uris.dart_core) {
1477 coreLibrary = library;
1478 } else if (uri == Uris.dart_async) {
1479 asyncLibrary = library;
1480 } else if (uri == Uris.dart__native_typed_data) {
1481 typedDataLibrary = library;
1482 } else if (uri == Uris.dart_mirrors) {
1483 mirrorsLibrary = library;
1484 } else if (uri == js_backend.BackendHelpers.DART_JS_HELPER) {
1485 jsHelperLibrary = library;
1486 }
1487 }
1488
1489 Element _findRequired(LibraryElement library, String name) {
1490 // If the script of the library is synthesized, the library does not exist
1491 // and we do not try to load the helpers.
1492 //
1493 // This could for example happen if dart:async is disabled, then loading it
1494 // should not try to find the given element.
1495 if (library == null || library.isSynthesized) return null;
1496
1497 var element = library.find(name);
1498 if (element == null) {
1499 reporter.internalError(
1500 library,
1501 "The library '${library.canonicalUri}' does not contain required "
1502 "element: '$name'.");
1503 }
1504 return element;
1505 }
1450 } 1506 }
1451 1507
1452 class CompilerDiagnosticReporter extends DiagnosticReporter { 1508 class CompilerDiagnosticReporter extends DiagnosticReporter {
1453 final Compiler compiler; 1509 final Compiler compiler;
1454 final DiagnosticOptions options; 1510 final DiagnosticOptions options;
1455 1511
1456 Element _currentElement; 1512 Element _currentElement;
1457 bool hasCrashed = false; 1513 bool hasCrashed = false;
1458 1514
1459 /// `true` if the last diagnostic was filtered, in which case the 1515 /// `true` if the last diagnostic was filtered, in which case the
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
1886 @override 1942 @override
1887 ParsingContext get parsingContext => compiler.parsingContext; 1943 ParsingContext get parsingContext => compiler.parsingContext;
1888 1944
1889 @override 1945 @override
1890 CoreClasses get coreClasses => compiler.coreClasses; 1946 CoreClasses get coreClasses => compiler.coreClasses;
1891 1947
1892 @override 1948 @override
1893 CoreTypes get coreTypes => compiler.coreTypes; 1949 CoreTypes get coreTypes => compiler.coreTypes;
1894 1950
1895 @override 1951 @override
1952 CommonElements get commonElements => compiler.commonElements;
1953
1954 @override
1896 Types get types => compiler.types; 1955 Types get types => compiler.types;
1897 1956
1898 @override 1957 @override
1899 Target get target => compiler.backend; 1958 Target get target => compiler.backend;
1900 1959
1901 @override 1960 @override
1902 ResolverTask get resolver => compiler.resolver; 1961 ResolverTask get resolver => compiler.resolver;
1903 1962
1904 @override 1963 @override
1905 ResolutionEnqueuer get enqueuer => compiler.enqueuer.resolution; 1964 ResolutionEnqueuer get enqueuer => compiler.enqueuer.resolution;
1906 1965
1907 @override 1966 @override
1908 CompilerOptions get options => compiler.options; 1967 CompilerOptions get options => compiler.options;
1909 1968
1910 @override 1969 @override
1911 IdGenerator get idGenerator => compiler.idGenerator; 1970 IdGenerator get idGenerator => compiler.idGenerator;
1912 1971
1913 @override 1972 @override
1914 ConstantEnvironment get constants => compiler.constants; 1973 ConstantEnvironment get constants => compiler.constants;
1915 1974
1916 @override 1975 @override
1917 MirrorUsageAnalyzerTask get mirrorUsageAnalyzerTask => 1976 MirrorUsageAnalyzerTask get mirrorUsageAnalyzerTask =>
1918 compiler.mirrorUsageAnalyzerTask; 1977 compiler.mirrorUsageAnalyzerTask;
1919 1978
1920 @override 1979 @override
1921 LibraryElement get coreLibrary => compiler.coreLibrary; 1980 LibraryElement get coreLibrary => compiler._coreTypes.coreLibrary;
1922 1981
1923 @override 1982 @override
1924 FunctionElement get identicalFunction => compiler.identicalFunction; 1983 bool get wasProxyConstantComputedTestingOnly => _proxyConstant != null;
1925
1926 @override
1927 ClassElement get mirrorSystemClass => compiler.mirrorSystemClass;
1928
1929 @override
1930 FunctionElement get mirrorSystemGetNameFunction =>
1931 compiler.mirrorSystemGetNameFunction;
1932
1933 @override
1934 ConstructorElement get mirrorsUsedConstructor =>
1935 compiler.mirrorsUsedConstructor;
1936
1937 @override
1938 ConstructorElement get symbolConstructor => compiler.symbolConstructor;
1939
1940 @override
1941 ConstantValue proxyConstant;
1942 1984
1943 @override 1985 @override
1944 void registerClass(ClassElement cls) { 1986 void registerClass(ClassElement cls) {
1945 compiler.world.registerClass(cls); 1987 compiler.world.registerClass(cls);
1946 } 1988 }
1947 1989
1948 @override 1990 @override
1949 void resolveClass(ClassElement cls) { 1991 void resolveClass(ClassElement cls) {
1950 compiler.resolver.resolveClass(cls); 1992 compiler.resolver.resolveClass(cls);
1951 } 1993 }
(...skipping 20 matching lines...) Expand all
1972 2014
1973 @override 2015 @override
1974 void ensureResolved(Element element) { 2016 void ensureResolved(Element element) {
1975 if (compiler.serialization.isDeserialized(element)) { 2017 if (compiler.serialization.isDeserialized(element)) {
1976 return; 2018 return;
1977 } 2019 }
1978 computeWorldImpact(element); 2020 computeWorldImpact(element);
1979 } 2021 }
1980 2022
1981 @override 2023 @override
1982 void onClassResolved(ClassElement element) =>
1983 compiler.onClassResolved(element);
1984
1985 @override
1986 void registerCompileTimeError(Element element, DiagnosticMessage message) => 2024 void registerCompileTimeError(Element element, DiagnosticMessage message) =>
1987 compiler.registerCompileTimeError(element, message); 2025 compiler.registerCompileTimeError(element, message);
1988 2026
1989 @override 2027 @override
1990 bool hasResolvedAst(ExecutableElement element) { 2028 bool hasResolvedAst(ExecutableElement element) {
1991 assert(invariant(element, element.isDeclaration, 2029 assert(invariant(element, element.isDeclaration,
1992 message: "Element $element must be the declaration.")); 2030 message: "Element $element must be the declaration."));
1993 if (compiler.serialization.isDeserialized(element)) { 2031 if (compiler.serialization.isDeserialized(element)) {
1994 return compiler.serialization.hasResolvedAst(element); 2032 return compiler.serialization.hasResolvedAst(element);
1995 } 2033 }
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
2124 return new ResolutionWorkItem(element, compilationContext); 2162 return new ResolutionWorkItem(element, compilationContext);
2125 } 2163 }
2126 } 2164 }
2127 2165
2128 @override 2166 @override
2129 void forgetElement(Element element) { 2167 void forgetElement(Element element) {
2130 _worldImpactCache.remove(element); 2168 _worldImpactCache.remove(element);
2131 _resolutionImpactCache.remove(element); 2169 _resolutionImpactCache.remove(element);
2132 } 2170 }
2133 2171
2172 ConstantValue _proxyConstant;
2173
2134 @override 2174 @override
2135 bool isProxyConstant(ConstantValue value) { 2175 bool isProxyConstant(ConstantValue value) {
2136 FieldElement field = coreLibrary.find('proxy'); 2176 FieldElement field = coreLibrary.find('proxy');
2137 if (field == null) return false; 2177 if (field == null) return false;
2138 if (!hasBeenResolved(field)) return false; 2178 if (!hasBeenResolved(field)) return false;
2139 if (proxyConstant == null) { 2179 if (_proxyConstant == null) {
2140 proxyConstant = constants 2180 _proxyConstant = constants
2141 .getConstantValue(resolver.constantCompiler.compileConstant(field)); 2181 .getConstantValue(resolver.constantCompiler.compileConstant(field));
2142 } 2182 }
2143 return proxyConstant == value; 2183 return _proxyConstant == value;
2144 } 2184 }
2145 } 2185 }
2146 2186
2147 class GlobalDependencyRegistry extends EagerRegistry { 2187 class GlobalDependencyRegistry extends EagerRegistry {
2148 final Compiler compiler; 2188 final Compiler compiler;
2149 Setlet<Element> _otherDependencies; 2189 Setlet<Element> _otherDependencies;
2150 2190
2151 GlobalDependencyRegistry(this.compiler) : super('GlobalDependencies', null); 2191 GlobalDependencyRegistry(this.compiler) : super('GlobalDependencies', null);
2152 2192
2153 // TODO(johnniwinther): Rename world/universe/enqueuer through out the 2193 // TODO(johnniwinther): Rename world/universe/enqueuer through out the
(...skipping 22 matching lines...) Expand all
2176 compiler.readScript(uri, spannable); 2216 compiler.readScript(uri, spannable);
2177 } 2217 }
2178 2218
2179 /// [ScriptLoader] used to ensure that scripts are not loaded accidentally 2219 /// [ScriptLoader] used to ensure that scripts are not loaded accidentally
2180 /// through the [LibraryLoader] when `CompilerOptions.compileOnly` is `true`. 2220 /// through the [LibraryLoader] when `CompilerOptions.compileOnly` is `true`.
2181 class _NoScriptLoader implements ScriptLoader { 2221 class _NoScriptLoader implements ScriptLoader {
2182 Compiler compiler; 2222 Compiler compiler;
2183 _NoScriptLoader(this.compiler); 2223 _NoScriptLoader(this.compiler);
2184 2224
2185 Future<Script> readScript(Uri uri, [Spannable spannable]) { 2225 Future<Script> readScript(Uri uri, [Spannable spannable]) {
2186 compiler.reporter.internalError(spannable, 2226 compiler.reporter
2187 "Script loading of '$uri' is not enabled."); 2227 .internalError(spannable, "Script loading of '$uri' is not enabled.");
2188 } 2228 }
2189 } 2229 }
2190 2230
2191 class _ElementScanner implements ElementScanner { 2231 class _ElementScanner implements ElementScanner {
2192 ScannerTask scanner; 2232 ScannerTask scanner;
2193 _ElementScanner(this.scanner); 2233 _ElementScanner(this.scanner);
2194 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library); 2234 void scanLibrary(LibraryElement library) => scanner.scanLibrary(library);
2195 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit); 2235 void scanUnit(CompilationUnitElement unit) => scanner.scan(unit);
2196 } 2236 }
2197 2237
2198 class _EmptyEnvironment implements Environment { 2238 class _EmptyEnvironment implements Environment {
2199 const _EmptyEnvironment(); 2239 const _EmptyEnvironment();
2200 2240
2201 String valueOf(String key) => null; 2241 String valueOf(String key) => null;
2202 } 2242 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/compile_time_constants.dart ('k') | pkg/compiler/lib/src/core_types.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698