OLD | NEW |
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 part of dart2js; | 5 part of dart2js; |
6 | 6 |
7 /** | 7 /** |
8 * If true, print a warning for each method that was resolved, but not | 8 * If true, print a warning for each method that was resolved, but not |
9 * compiled. | 9 * compiled. |
10 */ | 10 */ |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 final Map<String, LibraryElement> libraries; | 96 final Map<String, LibraryElement> libraries; |
97 int nextFreeClassId = 0; | 97 int nextFreeClassId = 0; |
98 World world; | 98 World world; |
99 String assembledCode; | 99 String assembledCode; |
100 Types types; | 100 Types types; |
101 | 101 |
102 final bool enableMinification; | 102 final bool enableMinification; |
103 final bool enableTypeAssertions; | 103 final bool enableTypeAssertions; |
104 final bool enableUserAssertions; | 104 final bool enableUserAssertions; |
105 final bool enableConcreteTypeInference; | 105 final bool enableConcreteTypeInference; |
| 106 final bool analyzeAll; |
106 | 107 |
107 bool disableInlining = false; | 108 bool disableInlining = false; |
108 | 109 |
109 final Tracer tracer; | 110 final Tracer tracer; |
110 | 111 |
111 CompilerTask measuredTask; | 112 CompilerTask measuredTask; |
112 Element _currentElement; | 113 Element _currentElement; |
113 LibraryElement coreLibrary; | 114 LibraryElement coreLibrary; |
114 LibraryElement isolateLibrary; | 115 LibraryElement isolateLibrary; |
115 LibraryElement jsHelperLibrary; | 116 LibraryElement jsHelperLibrary; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 bool hasCrashed = false; | 207 bool hasCrashed = false; |
207 | 208 |
208 Compiler({this.tracer: const Tracer(), | 209 Compiler({this.tracer: const Tracer(), |
209 this.enableTypeAssertions: false, | 210 this.enableTypeAssertions: false, |
210 this.enableUserAssertions: false, | 211 this.enableUserAssertions: false, |
211 this.enableConcreteTypeInference: false, | 212 this.enableConcreteTypeInference: false, |
212 this.enableMinification: false, | 213 this.enableMinification: false, |
213 bool emitJavaScript: true, | 214 bool emitJavaScript: true, |
214 bool generateSourceMap: true, | 215 bool generateSourceMap: true, |
215 bool disallowUnsafeEval: false, | 216 bool disallowUnsafeEval: false, |
| 217 this.analyzeAll: false, |
216 List<String> strips: const []}) | 218 List<String> strips: const []}) |
217 : libraries = new Map<String, LibraryElement>(), | 219 : libraries = new Map<String, LibraryElement>(), |
218 progress = new Stopwatch() { | 220 progress = new Stopwatch() { |
219 progress.start(); | 221 progress.start(); |
220 world = new World(this); | 222 world = new World(this); |
221 scanner = new ScannerTask(this); | 223 scanner = new ScannerTask(this); |
222 dietParser = new DietParserTask(this); | 224 dietParser = new DietParserTask(this); |
223 parser = new ParserTask(this); | 225 parser = new ParserTask(this); |
224 patchParser = new PatchParserTask(this); | 226 patchParser = new PatchParserTask(this); |
225 libraryLoader = new LibraryLoaderTask(this); | 227 libraryLoader = new LibraryLoaderTask(this); |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 if (!main.isFunction()) reportFatalError('main is not a function', main); | 512 if (!main.isFunction()) reportFatalError('main is not a function', main); |
511 FunctionElement mainMethod = main; | 513 FunctionElement mainMethod = main; |
512 FunctionSignature parameters = mainMethod.computeSignature(this); | 514 FunctionSignature parameters = mainMethod.computeSignature(this); |
513 parameters.forEachParameter((Element parameter) { | 515 parameters.forEachParameter((Element parameter) { |
514 reportFatalError('main cannot have parameters', parameter); | 516 reportFatalError('main cannot have parameters', parameter); |
515 }); | 517 }); |
516 } | 518 } |
517 | 519 |
518 log('Resolving...'); | 520 log('Resolving...'); |
519 phase = PHASE_RESOLVING; | 521 phase = PHASE_RESOLVING; |
| 522 if (analyzeAll) libraries.forEach((_, lib) => fullyEnqueueLibrary(lib)); |
520 backend.enqueueHelpers(enqueuer.resolution); | 523 backend.enqueueHelpers(enqueuer.resolution); |
521 processQueue(enqueuer.resolution, main); | 524 processQueue(enqueuer.resolution, main); |
522 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); | 525 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); |
523 | 526 |
524 if (compilationFailed) return; | 527 if (compilationFailed) return; |
525 | 528 |
526 log('Inferring types...'); | 529 log('Inferring types...'); |
527 typesTask.onResolutionComplete(main); | 530 typesTask.onResolutionComplete(main); |
528 | 531 |
529 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution | 532 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution |
530 // should know this. | 533 // should know this. |
531 world.populate(); | 534 world.populate(); |
532 | 535 |
533 log('Compiling...'); | 536 log('Compiling...'); |
534 phase = PHASE_COMPILING; | 537 phase = PHASE_COMPILING; |
535 processQueue(enqueuer.codegen, main); | 538 processQueue(enqueuer.codegen, main); |
536 log('Compiled ${codegenWorld.generatedCode.length} methods.'); | 539 log('Compiled ${codegenWorld.generatedCode.length} methods.'); |
537 | 540 |
538 if (compilationFailed) return; | 541 if (compilationFailed) return; |
539 | 542 |
540 backend.assembleProgram(); | 543 backend.assembleProgram(); |
541 | 544 |
542 checkQueues(); | 545 checkQueues(); |
543 } | 546 } |
544 | 547 |
| 548 void fullyEnqueueLibrary(LibraryElement library) { |
| 549 library.forEachLocalMember(fullyEnqueueTopLevelElement); |
| 550 } |
| 551 |
| 552 void fullyEnqueueTopLevelElement(Element element) { |
| 553 if (element.isClass()) { |
| 554 ClassElement cls = element; |
| 555 cls.ensureResolved(this); |
| 556 for (Element member in cls.localMembers) { |
| 557 enqueuer.resolution.addToWorkList(member); |
| 558 } |
| 559 } else { |
| 560 enqueuer.resolution.addToWorkList(element); |
| 561 } |
| 562 } |
| 563 |
545 void processQueue(Enqueuer world, Element main) { | 564 void processQueue(Enqueuer world, Element main) { |
546 backend.processNativeClasses(world, libraries.values); | 565 backend.processNativeClasses(world, libraries.values); |
547 world.addToWorkList(main); | 566 world.addToWorkList(main); |
548 progress.reset(); | 567 progress.reset(); |
549 world.forEach((WorkItem work) { | 568 world.forEach((WorkItem work) { |
550 withCurrentElement(work.element, () => work.run(this, world)); | 569 withCurrentElement(work.element, () => work.run(this, world)); |
551 }); | 570 }); |
552 world.queueIsClosed = true; | 571 world.queueIsClosed = true; |
553 if (compilationFailed) return; | 572 if (compilationFailed) return; |
554 assert(world.checkNoEnqueuedInvokedInstanceMethods()); | 573 assert(world.checkNoEnqueuedInvokedInstanceMethods()); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 SourceSpan span = spanFromElement(e); | 621 SourceSpan span = spanFromElement(e); |
603 reportDiagnostic(span, 'Warning: $e resolved but not compiled.', | 622 reportDiagnostic(span, 'Warning: $e resolved but not compiled.', |
604 api.Diagnostic.WARNING); | 623 api.Diagnostic.WARNING); |
605 } | 624 } |
606 } | 625 } |
607 | 626 |
608 TreeElements analyzeElement(Element element) { | 627 TreeElements analyzeElement(Element element) { |
609 assert(invariant(element, element.isDeclaration)); | 628 assert(invariant(element, element.isDeclaration)); |
610 TreeElements elements = enqueuer.resolution.getCachedElements(element); | 629 TreeElements elements = enqueuer.resolution.getCachedElements(element); |
611 if (elements != null) return elements; | 630 if (elements != null) return elements; |
612 final int allowed = ElementCategory.VARIABLE | ElementCategory.FUNCTION | |
613 | ElementCategory.FACTORY; | |
614 ElementKind kind = element.kind; | |
615 if (!element.isAccessor() && | |
616 ((identical(kind, ElementKind.ABSTRACT_FIELD)) || | |
617 (kind.category & allowed) == 0)) { | |
618 return null; | |
619 } | |
620 assert(parser != null); | 631 assert(parser != null); |
621 Node tree = parser.parse(element); | 632 Node tree = parser.parse(element); |
622 validator.validate(tree); | 633 validator.validate(tree); |
623 elements = resolver.resolve(element); | 634 elements = resolver.resolve(element); |
624 checker.check(tree, elements); | 635 checker.check(tree, elements); |
625 typesTask.analyze(tree, elements); | 636 typesTask.analyze(tree, elements); |
626 return elements; | 637 return elements; |
627 } | 638 } |
628 | 639 |
629 TreeElements analyze(WorkItem work, Enqueuer world) { | 640 TreeElements analyze(WorkItem work, Enqueuer world) { |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 // TODO(johnniwinther): Use [spannable] and [message] to provide better | 914 // TODO(johnniwinther): Use [spannable] and [message] to provide better |
904 // information on assertion errors. | 915 // information on assertion errors. |
905 if (condition is Function){ | 916 if (condition is Function){ |
906 condition = condition(); | 917 condition = condition(); |
907 } | 918 } |
908 if (spannable == null || !condition) { | 919 if (spannable == null || !condition) { |
909 throw new SpannableAssertionFailure(spannable, message); | 920 throw new SpannableAssertionFailure(spannable, message); |
910 } | 921 } |
911 return true; | 922 return true; |
912 } | 923 } |
OLD | NEW |