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

Side by Side Diff: dart/sdk/lib/_internal/compiler/implementation/compiler.dart

Issue 11416004: Reject deprecated language features. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: abstract class in resolver test Created 8 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 | Annotate | Revision Log
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 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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 World world; 106 World world;
107 String assembledCode; 107 String assembledCode;
108 Types types; 108 Types types;
109 109
110 final bool enableMinification; 110 final bool enableMinification;
111 final bool enableTypeAssertions; 111 final bool enableTypeAssertions;
112 final bool enableUserAssertions; 112 final bool enableUserAssertions;
113 final bool enableConcreteTypeInference; 113 final bool enableConcreteTypeInference;
114 final bool analyzeAll; 114 final bool analyzeAll;
115 final bool enableNativeLiveTypeAnalysis; 115 final bool enableNativeLiveTypeAnalysis;
116 final bool rejectDeprecatedFeatures;
117 final bool checkDeprecationInSdk;
116 118
117 bool disableInlining = false; 119 bool disableInlining = false;
118 120
119 final Tracer tracer; 121 final Tracer tracer;
120 122
121 CompilerTask measuredTask; 123 CompilerTask measuredTask;
122 Element _currentElement; 124 Element _currentElement;
123 LibraryElement coreLibrary; 125 LibraryElement coreLibrary;
124 LibraryElement isolateLibrary; 126 LibraryElement isolateLibrary;
125 LibraryElement jsHelperLibrary; 127 LibraryElement jsHelperLibrary;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 Compiler({this.tracer: const Tracer(), 220 Compiler({this.tracer: const Tracer(),
219 this.enableTypeAssertions: false, 221 this.enableTypeAssertions: false,
220 this.enableUserAssertions: false, 222 this.enableUserAssertions: false,
221 this.enableConcreteTypeInference: false, 223 this.enableConcreteTypeInference: false,
222 this.enableMinification: false, 224 this.enableMinification: false,
223 this.enableNativeLiveTypeAnalysis: false, 225 this.enableNativeLiveTypeAnalysis: false,
224 bool emitJavaScript: true, 226 bool emitJavaScript: true,
225 bool generateSourceMap: true, 227 bool generateSourceMap: true,
226 bool disallowUnsafeEval: false, 228 bool disallowUnsafeEval: false,
227 this.analyzeAll: false, 229 this.analyzeAll: false,
230 this.rejectDeprecatedFeatures: false,
231 this.checkDeprecationInSdk: false,
228 List<String> strips: const []}) 232 List<String> strips: const []})
229 : libraries = new Map<String, LibraryElement>(), 233 : libraries = new Map<String, LibraryElement>(),
230 progress = new Stopwatch() { 234 progress = new Stopwatch() {
231 progress.start(); 235 progress.start();
232 world = new World(this); 236 world = new World(this);
233 scanner = new ScannerTask(this); 237 scanner = new ScannerTask(this);
234 dietParser = new DietParserTask(this); 238 dietParser = new DietParserTask(this);
235 parser = new ParserTask(this); 239 parser = new ParserTask(this);
236 patchParser = new PatchParserTask(this); 240 patchParser = new PatchParserTask(this);
237 libraryLoader = new LibraryLoaderTask(this); 241 libraryLoader = new LibraryLoaderTask(this);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 } 338 }
335 339
336 void log(message) { 340 void log(message) {
337 reportDiagnostic(null, message, api.Diagnostic.VERBOSE_INFO); 341 reportDiagnostic(null, message, api.Diagnostic.VERBOSE_INFO);
338 } 342 }
339 343
340 bool run(Uri uri) { 344 bool run(Uri uri) {
341 try { 345 try {
342 runCompiler(uri); 346 runCompiler(uri);
343 } on CompilerCancelledException catch (exception) { 347 } on CompilerCancelledException catch (exception) {
344 log(exception.toString()); 348 log('Error: $exception');
345 log('compilation failed');
346 return false; 349 return false;
347 } 350 }
348 tracer.close(); 351 tracer.close();
349 log('compilation succeeded');
350 return true; 352 return true;
351 } 353 }
352 354
353 void enableNoSuchMethod(Element element) { 355 void enableNoSuchMethod(Element element) {
354 // TODO(ahe): Move this method to Enqueuer. 356 // TODO(ahe): Move this method to Enqueuer.
355 if (enabledNoSuchMethod) return; 357 if (enabledNoSuchMethod) return;
356 if (identical(element.getEnclosingClass(), objectClass)) { 358 if (identical(element.getEnclosingClass(), objectClass)) {
357 enqueuer.resolution.registerDynamicInvocationOf(element); 359 enqueuer.resolution.registerDynamicInvocationOf(element);
358 return; 360 return;
359 } 361 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 // this way. 394 // this way.
393 withCurrentElement(dynamicClass, () { 395 withCurrentElement(dynamicClass, () {
394 library.addToScope(dynamicClass, this); 396 library.addToScope(dynamicClass, this);
395 }); 397 });
396 } 398 }
397 } 399 }
398 400
399 LibraryElement scanBuiltinLibrary(String filename); 401 LibraryElement scanBuiltinLibrary(String filename);
400 402
401 void initializeSpecialClasses() { 403 void initializeSpecialClasses() {
402 bool coreLibValid = true; 404 final List missingClasses = [];
403 ClassElement lookupSpecialClass(SourceString name) { 405 ClassElement lookupSpecialClass(SourceString name) {
404 ClassElement result = coreLibrary.find(name); 406 ClassElement result = coreLibrary.find(name);
405 if (result == null) { 407 if (result == null) {
406 log('core library class $name missing'); 408 missingClasses.add(name.slowToString());
407 coreLibValid = false;
408 } 409 }
409 return result; 410 return result;
410 } 411 }
411 objectClass = lookupSpecialClass(const SourceString('Object')); 412 objectClass = lookupSpecialClass(const SourceString('Object'));
412 boolClass = lookupSpecialClass(const SourceString('bool')); 413 boolClass = lookupSpecialClass(const SourceString('bool'));
413 numClass = lookupSpecialClass(const SourceString('num')); 414 numClass = lookupSpecialClass(const SourceString('num'));
414 intClass = lookupSpecialClass(const SourceString('int')); 415 intClass = lookupSpecialClass(const SourceString('int'));
415 doubleClass = lookupSpecialClass(const SourceString('double')); 416 doubleClass = lookupSpecialClass(const SourceString('double'));
416 stringClass = lookupSpecialClass(const SourceString('String')); 417 stringClass = lookupSpecialClass(const SourceString('String'));
417 functionClass = lookupSpecialClass(const SourceString('Function')); 418 functionClass = lookupSpecialClass(const SourceString('Function'));
418 listClass = lookupSpecialClass(const SourceString('List')); 419 listClass = lookupSpecialClass(const SourceString('List'));
419 typeClass = lookupSpecialClass(const SourceString('Type')); 420 typeClass = lookupSpecialClass(const SourceString('Type'));
420 mapClass = lookupSpecialClass(const SourceString('Map')); 421 mapClass = lookupSpecialClass(const SourceString('Map'));
421 jsInvocationMirrorClass = 422 jsInvocationMirrorClass =
422 lookupSpecialClass(const SourceString('JSInvocationMirror')); 423 lookupSpecialClass(const SourceString('JSInvocationMirror'));
423 closureClass = lookupSpecialClass(const SourceString('Closure')); 424 closureClass = lookupSpecialClass(const SourceString('Closure'));
424 dynamicClass = lookupSpecialClass(const SourceString('Dynamic_')); 425 dynamicClass = lookupSpecialClass(const SourceString('Dynamic_'));
425 nullClass = lookupSpecialClass(const SourceString('Null')); 426 nullClass = lookupSpecialClass(const SourceString('Null'));
426 types = new Types(this, dynamicClass); 427 types = new Types(this, dynamicClass);
427 if (!coreLibValid) { 428 if (!missingClasses.isEmpty) {
428 cancel('core library does not contain required classes'); 429 cancel('core library does not contain required classes: $missingClasses');
429 } 430 }
430 } 431 }
431 432
432 void scanBuiltinLibraries() { 433 void scanBuiltinLibraries() {
433 jsHelperLibrary = scanBuiltinLibrary('_js_helper'); 434 jsHelperLibrary = scanBuiltinLibrary('_js_helper');
434 interceptorsLibrary = scanBuiltinLibrary('_interceptors'); 435 interceptorsLibrary = scanBuiltinLibrary('_interceptors');
435 436
436 // The core library was loaded and patched before jsHelperLibrary was 437 // The core library was loaded and patched before jsHelperLibrary was
437 // initialized, so it wasn't imported into those two libraries during 438 // initialized, so it wasn't imported into those two libraries during
438 // patching. 439 // patching.
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
760 reportDiagnostic(span, 'Error: $message', api.Diagnostic.ERROR); 761 reportDiagnostic(span, 'Error: $message', api.Diagnostic.ERROR);
761 throw new CompilerCancelledException(message.toString()); 762 throw new CompilerCancelledException(message.toString());
762 } 763 }
763 764
764 void reportMessage(SourceSpan span, Diagnostic message, api.Diagnostic kind) { 765 void reportMessage(SourceSpan span, Diagnostic message, api.Diagnostic kind) {
765 // TODO(ahe): The names Diagnostic and api.Diagnostic are in 766 // TODO(ahe): The names Diagnostic and api.Diagnostic are in
766 // conflict. Fix it. 767 // conflict. Fix it.
767 reportDiagnostic(span, "$message", kind); 768 reportDiagnostic(span, "$message", kind);
768 } 769 }
769 770
771 void onDeprecatedFeature(Spannable span, String feature) {
772 if (currentElement == null)
773 throw new SpannableAssertionFailure(span, feature);
774 if (!checkDeprecationInSdk &&
775 currentElement.getLibrary().isPlatformLibrary) {
776 return;
777 }
778 var kind = rejectDeprecatedFeatures
779 ? api.Diagnostic.ERROR : api.Diagnostic.WARNING;
780 var message = rejectDeprecatedFeatures
781 ? MessageKind.DEPRECATED_FEATURE_ERROR.error([feature])
782 : MessageKind.DEPRECATED_FEATURE_WARNING.error([feature]);
Johnni Winther 2012/11/19 08:37:22 The error/warning information should not be redund
ahe 2012/11/19 08:42:10 I would like to have a better API, but in general,
783 reportMessage(spanFromSpannable(span), message, kind);
784 }
785
770 void reportDiagnostic(SourceSpan span, String message, api.Diagnostic kind); 786 void reportDiagnostic(SourceSpan span, String message, api.Diagnostic kind);
771 787
772 SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) { 788 SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) {
773 if (begin == null || end == null) { 789 if (begin == null || end == null) {
774 // TODO(ahe): We can almost always do better. Often it is only 790 // TODO(ahe): We can almost always do better. Often it is only
775 // end that is null. Otherwise, we probably know the current 791 // end that is null. Otherwise, we probably know the current
776 // URI. 792 // URI.
777 throw 'Cannot find tokens to produce error message.'; 793 throw 'Cannot find tokens to produce error message.';
778 } 794 }
779 if (uri == null && currentElement != null) { 795 if (uri == null && currentElement != null) {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 // TODO(johnniwinther): Use [spannable] and [message] to provide better 940 // TODO(johnniwinther): Use [spannable] and [message] to provide better
925 // information on assertion errors. 941 // information on assertion errors.
926 if (condition is Function){ 942 if (condition is Function){
927 condition = condition(); 943 condition = condition();
928 } 944 }
929 if (spannable == null || !condition) { 945 if (spannable == null || !condition) {
930 throw new SpannableAssertionFailure(spannable, message); 946 throw new SpannableAssertionFailure(spannable, message);
931 } 947 }
932 return true; 948 return true;
933 } 949 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698