| 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 | 5 |
| 6 /** | 6 /** |
| 7 * If true, print a warning for each method that was resolved, but not | 7 * If true, print a warning for each method that was resolved, but not |
| 8 * compiled. | 8 * compiled. |
| 9 */ | 9 */ |
| 10 final bool REPORT_EXCESS_RESOLUTION = false; | 10 final bool REPORT_EXCESS_RESOLUTION = false; |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 bool enabledNoSuchMethod = false; | 296 bool enabledNoSuchMethod = false; |
| 297 | 297 |
| 298 Stopwatch progress; | 298 Stopwatch progress; |
| 299 | 299 |
| 300 static final int PHASE_SCANNING = 0; | 300 static final int PHASE_SCANNING = 0; |
| 301 static final int PHASE_RESOLVING = 1; | 301 static final int PHASE_RESOLVING = 1; |
| 302 static final int PHASE_COMPILING = 2; | 302 static final int PHASE_COMPILING = 2; |
| 303 static final int PHASE_RECOMPILING = 3; | 303 static final int PHASE_RECOMPILING = 3; |
| 304 int phase; | 304 int phase; |
| 305 | 305 |
| 306 bool compilationFailed = false; |
| 307 |
| 306 Compiler([this.tracer = const Tracer(), | 308 Compiler([this.tracer = const Tracer(), |
| 307 this.enableTypeAssertions = false, | 309 this.enableTypeAssertions = false, |
| 308 this.enableUserAssertions = false, | 310 this.enableUserAssertions = false, |
| 309 bool emitJavascript = true, | 311 bool emitJavascript = true, |
| 310 validateUnparse = false, | 312 validateUnparse = false, |
| 311 generateSourceMap = true]) | 313 generateSourceMap = true]) |
| 312 : libraries = new Map<String, LibraryElement>(), | 314 : libraries = new Map<String, LibraryElement>(), |
| 313 world = new World(), | 315 world = new World(), |
| 314 progress = new Stopwatch.start() { | 316 progress = new Stopwatch.start() { |
| 315 namer = new Namer(this); | 317 namer = new Namer(this); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution | 543 // TODO(ahe): Remove this line. Eventually, enqueuer.resolution |
| 542 // should know this. | 544 // should know this. |
| 543 world.populate(this, libraries.getValues()); | 545 world.populate(this, libraries.getValues()); |
| 544 | 546 |
| 545 log('Resolving...'); | 547 log('Resolving...'); |
| 546 phase = PHASE_RESOLVING; | 548 phase = PHASE_RESOLVING; |
| 547 backend.enqueueHelpers(enqueuer.resolution); | 549 backend.enqueueHelpers(enqueuer.resolution); |
| 548 processQueue(enqueuer.resolution, main); | 550 processQueue(enqueuer.resolution, main); |
| 549 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); | 551 log('Resolved ${enqueuer.resolution.resolvedElements.length} elements.'); |
| 550 | 552 |
| 553 if (compilationFailed) return; |
| 554 |
| 551 log('Compiling...'); | 555 log('Compiling...'); |
| 552 phase = PHASE_COMPILING; | 556 phase = PHASE_COMPILING; |
| 553 processQueue(enqueuer.codegen, main); | 557 processQueue(enqueuer.codegen, main); |
| 554 log("Recompiling ${enqueuer.codegen.recompilationCandidates.length} " | 558 log("Recompiling ${enqueuer.codegen.recompilationCandidates.length} " |
| 555 "methods..."); | 559 "methods..."); |
| 556 phase = PHASE_RECOMPILING; | 560 phase = PHASE_RECOMPILING; |
| 557 processRecompilationQueue(enqueuer.codegen); | 561 processRecompilationQueue(enqueuer.codegen); |
| 558 log('Compiled ${codegenWorld.generatedCode.length} methods.'); | 562 log('Compiled ${codegenWorld.generatedCode.length} methods.'); |
| 559 | 563 |
| 564 if (compilationFailed) return; |
| 565 |
| 560 backend.assembleProgram(); | 566 backend.assembleProgram(); |
| 561 | 567 |
| 562 checkQueues(); | 568 checkQueues(); |
| 563 } | 569 } |
| 564 | 570 |
| 565 void processQueue(Enqueuer world, Element main) { | 571 void processQueue(Enqueuer world, Element main) { |
| 566 backend.processNativeClasses(world, libraries.getValues()); | 572 backend.processNativeClasses(world, libraries.getValues()); |
| 567 world.addToWorkList(main); | 573 world.addToWorkList(main); |
| 568 progress.reset(); | 574 progress.reset(); |
| 569 world.forEach((WorkItem work) { | 575 world.forEach((WorkItem work) { |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 748 // TODO(ahe): Don't supress these warning when the type checker | 754 // TODO(ahe): Don't supress these warning when the type checker |
| 749 // is more complete. | 755 // is more complete. |
| 750 if (message.message.kind === MessageKind.NOT_ASSIGNABLE) return; | 756 if (message.message.kind === MessageKind.NOT_ASSIGNABLE) return; |
| 751 if (message.message.kind === MessageKind.MISSING_RETURN) return; | 757 if (message.message.kind === MessageKind.MISSING_RETURN) return; |
| 752 if (message.message.kind === MessageKind.MAYBE_MISSING_RETURN) return; | 758 if (message.message.kind === MessageKind.MAYBE_MISSING_RETURN) return; |
| 753 if (message.message.kind === MessageKind.ADDITIONAL_ARGUMENT) return; | 759 if (message.message.kind === MessageKind.ADDITIONAL_ARGUMENT) return; |
| 754 if (message.message.kind === MessageKind.METHOD_NOT_FOUND) return; | 760 if (message.message.kind === MessageKind.METHOD_NOT_FOUND) return; |
| 755 } | 761 } |
| 756 SourceSpan span = spanFromNode(node); | 762 SourceSpan span = spanFromNode(node); |
| 757 | 763 |
| 758 reportDiagnostic(span, 'Warning: $message', api.Diagnostic.WARNING ); | 764 reportDiagnostic(span, 'Warning: $message', api.Diagnostic.WARNING); |
| 759 } | 765 } |
| 760 | 766 |
| 761 reportError(Node node, var message) { | 767 reportError(Node node, var message) { |
| 762 SourceSpan span = spanFromNode(node); | 768 SourceSpan span = spanFromNode(node); |
| 763 reportDiagnostic(span, 'Error: $message', api.Diagnostic.ERROR); | 769 reportDiagnostic(span, 'Error: $message', api.Diagnostic.ERROR); |
| 764 throw new CompilerCancelledException(message.toString()); | 770 throw new CompilerCancelledException(message.toString()); |
| 765 } | 771 } |
| 766 | 772 |
| 773 void reportMessage(SourceSpan span, |
| 774 Diagnostic message, |
| 775 api.Diagnostic kind) { |
| 776 // TODO(ahe): The names Diagnostic and api.Diagnostic are in |
| 777 // conflict. Fix it. |
| 778 reportDiagnostic(span, "$message", kind); |
| 779 } |
| 780 |
| 767 abstract void reportDiagnostic(SourceSpan span, String message, | 781 abstract void reportDiagnostic(SourceSpan span, String message, |
| 768 api.Diagnostic kind); | 782 api.Diagnostic kind); |
| 769 | 783 |
| 770 SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) { | 784 SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) { |
| 771 if (begin === null || end === null) { | 785 if (begin === null || end === null) { |
| 772 // TODO(ahe): We can almost always do better. Often it is only | 786 // TODO(ahe): We can almost always do better. Often it is only |
| 773 // end that is null. Otherwise, we probably know the current | 787 // end that is null. Otherwise, we probably know the current |
| 774 // URI. | 788 // URI. |
| 775 throw 'Cannot find tokens to produce error message.'; | 789 throw 'Cannot find tokens to produce error message.'; |
| 776 } | 790 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 // invariant that endOffset > beginOffset, but for EOF the | 898 // invariant that endOffset > beginOffset, but for EOF the |
| 885 // charoffset of the next token may be [beginOffset]. This can | 899 // charoffset of the next token may be [beginOffset]. This can |
| 886 // also happen for synthetized tokens that are produced during | 900 // also happen for synthetized tokens that are produced during |
| 887 // error handling. | 901 // error handling. |
| 888 final endOffset = | 902 final endOffset = |
| 889 Math.max((end.next !== null) ? end.next.charOffset : 0, beginOffset + 1); | 903 Math.max((end.next !== null) ? end.next.charOffset : 0, beginOffset + 1); |
| 890 assert(endOffset > beginOffset); | 904 assert(endOffset > beginOffset); |
| 891 return f(beginOffset, endOffset); | 905 return f(beginOffset, endOffset); |
| 892 } | 906 } |
| 893 } | 907 } |
| OLD | NEW |