| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 | 2 |
| 3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
| 4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 import 'dart:collection' show HashMap, HashSet; | 6 import 'dart:collection' show HashMap, HashSet; |
| 7 import 'dart:math' show min, max; | 7 import 'dart:math' show min, max; |
| 8 | 8 |
| 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; | 9 import 'package:analyzer/analyzer.dart' hide ConstantEvaluator; |
| 10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| 11 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; | 11 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; |
| 12 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; | 12 import 'package:analyzer/dart/ast/token.dart' show Token, TokenType; |
| 13 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; | 13 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; |
| 14 import 'package:analyzer/dart/element/element.dart'; | 14 import 'package:analyzer/dart/element/element.dart'; |
| 15 import 'package:analyzer/dart/element/type.dart'; | 15 import 'package:analyzer/dart/element/type.dart'; |
| 16 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 16 import 'package:analyzer/src/dart/ast/token.dart' show StringToken; | 17 import 'package:analyzer/src/dart/ast/token.dart' show StringToken; |
| 17 import 'package:analyzer/src/dart/element/element.dart' | 18 import 'package:analyzer/src/dart/element/element.dart' |
| 18 show FieldElementImpl, LocalVariableElementImpl; | 19 show FieldElementImpl, LocalVariableElementImpl; |
| 19 import 'package:analyzer/src/dart/element/type.dart' show DynamicTypeImpl; | 20 import 'package:analyzer/src/dart/element/type.dart' show DynamicTypeImpl; |
| 20 import 'package:analyzer/src/dart/sdk/sdk.dart'; | 21 import 'package:analyzer/src/dart/sdk/sdk.dart'; |
| 21 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; | |
| 22 import 'package:analyzer/src/generated/resolver.dart' | 22 import 'package:analyzer/src/generated/resolver.dart' |
| 23 show TypeProvider, NamespaceBuilder; | 23 show NamespaceBuilder, TypeProvider; |
| 24 import 'package:analyzer/src/generated/type_system.dart' | 24 import 'package:analyzer/src/generated/type_system.dart' |
| 25 show StrongTypeSystemImpl; | 25 show StrongTypeSystemImpl; |
| 26 import 'package:analyzer/src/summary/idl.dart' show UnlinkedUnit; | 26 import 'package:analyzer/src/summary/idl.dart' show UnlinkedUnit; |
| 27 import 'package:analyzer/src/summary/link.dart' as summary_link; | 27 import 'package:analyzer/src/summary/link.dart' as summary_link; |
| 28 import 'package:analyzer/src/summary/package_bundle_reader.dart'; | 28 import 'package:analyzer/src/summary/package_bundle_reader.dart'; |
| 29 import 'package:analyzer/src/summary/summarize_ast.dart' | 29 import 'package:analyzer/src/summary/summarize_ast.dart' |
| 30 show serializeAstUnlinked; | 30 show serializeAstUnlinked; |
| 31 import 'package:analyzer/src/summary/summarize_elements.dart' | 31 import 'package:analyzer/src/summary/summarize_elements.dart' |
| 32 show PackageBundleAssembler; | 32 show PackageBundleAssembler; |
| 33 import 'package:analyzer/src/summary/summary_sdk.dart'; | 33 import 'package:analyzer/src/summary/summary_sdk.dart'; |
| 34 import 'package:analyzer/src/task/strong/ast_properties.dart' | 34 import 'package:analyzer/src/task/strong/ast_properties.dart' |
| 35 show isDynamicInvoke, setIsDynamicInvoke, getImplicitAssignmentCast; | 35 show isDynamicInvoke, setIsDynamicInvoke, getImplicitAssignmentCast; |
| 36 import 'package:meta/meta.dart'; |
| 36 import 'package:path/path.dart' show isWithin, relative, separator; | 37 import 'package:path/path.dart' show isWithin, relative, separator; |
| 37 | 38 |
| 38 import '../closure/closure_annotator.dart' show ClosureAnnotator; | 39 import '../closure/closure_annotator.dart' show ClosureAnnotator; |
| 39 import '../js_ast/js_ast.dart' as JS; | 40 import '../js_ast/js_ast.dart' as JS; |
| 40 import '../js_ast/js_ast.dart' show js; | 41 import '../js_ast/js_ast.dart' show js; |
| 41 import 'ast_builder.dart' show AstBuilder; | 42 import 'ast_builder.dart' show AstBuilder; |
| 42 import 'compiler.dart' show BuildUnit, CompilerOptions, JSModuleFile; | 43 import 'compiler.dart' show BuildUnit, CompilerOptions, JSModuleFile; |
| 43 import 'element_helpers.dart'; | 44 import 'element_helpers.dart'; |
| 44 import 'extension_types.dart' show ExtensionTypeSet; | 45 import 'extension_types.dart' show ExtensionTypeSet; |
| 45 import 'js_interop.dart'; | 46 import 'js_interop.dart'; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 63 /// Dart code, whenever this is possible to do in the generated code. | 64 /// Dart code, whenever this is possible to do in the generated code. |
| 64 // | 65 // |
| 65 // TODO(jmesserly): we should use separate visitors for statements and | 66 // TODO(jmesserly): we should use separate visitors for statements and |
| 66 // expressions. Declarations are handled directly, and many minor component | 67 // expressions. Declarations are handled directly, and many minor component |
| 67 // AST nodes aren't visited, so the visitor pattern isn't helping except for | 68 // AST nodes aren't visited, so the visitor pattern isn't helping except for |
| 68 // expressions (which result in JS.Expression) and statements | 69 // expressions (which result in JS.Expression) and statements |
| 69 // (which result in (JS.Statement). | 70 // (which result in (JS.Statement). |
| 70 class CodeGenerator extends Object | 71 class CodeGenerator extends Object |
| 71 with ClosureAnnotator, JsTypeRefCodegen, NullableTypeInference | 72 with ClosureAnnotator, JsTypeRefCodegen, NullableTypeInference |
| 72 implements AstVisitor<JS.Node> { | 73 implements AstVisitor<JS.Node> { |
| 73 final AnalysisContext context; | 74 final AnalysisDriver driver; |
| 74 final SummaryDataStore summaryData; | 75 final SummaryDataStore summaryData; |
| 75 | 76 |
| 76 final CompilerOptions options; | 77 final CompilerOptions options; |
| 77 final StrongTypeSystemImpl rules; | 78 final StrongTypeSystemImpl rules; |
| 78 | 79 |
| 79 /// The set of libraries we are currently compiling, and the temporaries used | 80 /// The set of libraries we are currently compiling, and the temporaries used |
| 80 /// to refer to them. | 81 /// to refer to them. |
| 81 /// | 82 /// |
| 82 /// We sometimes special case codegen for a single library, as it simplifies | 83 /// We sometimes special case codegen for a single library, as it simplifies |
| 83 /// name scoping requirements. | 84 /// name scoping requirements. |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 new HashMap<LibraryElement, HashMap<String, JS.TemporaryId>>(); | 117 new HashMap<LibraryElement, HashMap<String, JS.TemporaryId>>(); |
| 117 final _initializingFormalTemps = | 118 final _initializingFormalTemps = |
| 118 new HashMap<ParameterElement, JS.TemporaryId>(); | 119 new HashMap<ParameterElement, JS.TemporaryId>(); |
| 119 | 120 |
| 120 JS.Identifier _extensionSymbolsModule; | 121 JS.Identifier _extensionSymbolsModule; |
| 121 JS.Identifier _runtimeModule; | 122 JS.Identifier _runtimeModule; |
| 122 final namedArgumentTemp = new JS.TemporaryId('opts'); | 123 final namedArgumentTemp = new JS.TemporaryId('opts'); |
| 123 | 124 |
| 124 final _hasDeferredSupertype = new HashSet<ClassElement>(); | 125 final _hasDeferredSupertype = new HashSet<ClassElement>(); |
| 125 | 126 |
| 126 /// The type provider from the current Analysis [context]. | 127 /// The type provider for the SDK. |
| 127 final TypeProvider types; | 128 final TypeProvider types; |
| 128 | 129 |
| 129 final LibraryElement dartCoreLibrary; | 130 final LibraryElement dartCoreLibrary; |
| 130 final LibraryElement dartJSLibrary; | 131 final LibraryElement dartJSLibrary; |
| 131 | 132 |
| 132 /// The dart:async `StreamIterator<>` type. | 133 /// The dart:async `StreamIterator<>` type. |
| 133 final InterfaceType _asyncStreamIterator; | 134 final InterfaceType _asyncStreamIterator; |
| 134 | 135 |
| 135 /// The dart:_interceptors JSArray element. | 136 /// The dart:_interceptors JSArray element. |
| 136 final ClassElement _jsArray; | 137 final ClassElement _jsArray; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 186 |
| 186 /// Information about virtual and overridden fields/getters/setters in the | 187 /// Information about virtual and overridden fields/getters/setters in the |
| 187 /// class we're currently compiling, or `null` if we aren't compiling a class. | 188 /// class we're currently compiling, or `null` if we aren't compiling a class. |
| 188 ClassPropertyModel _classProperties; | 189 ClassPropertyModel _classProperties; |
| 189 | 190 |
| 190 /// Information about virtual fields for all libraries in the current build | 191 /// Information about virtual fields for all libraries in the current build |
| 191 /// unit. | 192 /// unit. |
| 192 final virtualFields = new VirtualFieldModel(); | 193 final virtualFields = new VirtualFieldModel(); |
| 193 | 194 |
| 194 CodeGenerator( | 195 CodeGenerator( |
| 195 AnalysisContext c, this.summaryData, this.options, this._extensionTypes) | 196 this.driver, this.summaryData, this.options, this._extensionTypes, |
| 196 : context = c, | 197 {@required this.types, |
| 197 rules = new StrongTypeSystemImpl(c.typeProvider), | 198 @required LibraryElement coreLibrary, |
| 198 types = c.typeProvider, | 199 @required LibraryElement asyncLibrary, |
| 199 _asyncStreamIterator = | 200 @required LibraryElement interceptorsLibrary, |
| 200 _getLibrary(c, 'dart:async').getType('StreamIterator').type, | 201 @required LibraryElement internalLibrary, |
| 201 _jsArray = _getLibrary(c, 'dart:_interceptors').getType('JSArray'), | 202 @required LibraryElement jsLibrary}) |
| 202 interceptorClass = | 203 : rules = new StrongTypeSystemImpl(types), |
| 203 _getLibrary(c, 'dart:_interceptors').getType('Interceptor'), | 204 _asyncStreamIterator = asyncLibrary.getType('StreamIterator').type, |
| 204 dartCoreLibrary = _getLibrary(c, 'dart:core'), | 205 _jsArray = interceptorsLibrary.getType('JSArray'), |
| 205 boolClass = _getLibrary(c, 'dart:core').getType('bool'), | 206 interceptorClass = interceptorsLibrary.getType('Interceptor'), |
| 206 intClass = _getLibrary(c, 'dart:core').getType('int'), | 207 dartCoreLibrary = coreLibrary, |
| 207 numClass = _getLibrary(c, 'dart:core').getType('num'), | 208 boolClass = coreLibrary.getType('bool'), |
| 208 nullClass = _getLibrary(c, 'dart:core').getType('Null'), | 209 intClass = coreLibrary.getType('int'), |
| 209 objectClass = _getLibrary(c, 'dart:core').getType('Object'), | 210 numClass = coreLibrary.getType('num'), |
| 210 stringClass = _getLibrary(c, 'dart:core').getType('String'), | 211 nullClass = coreLibrary.getType('Null'), |
| 211 functionClass = _getLibrary(c, 'dart:core').getType('Function'), | 212 objectClass = coreLibrary.getType('Object'), |
| 212 privateSymbolClass = | 213 stringClass = coreLibrary.getType('String'), |
| 213 _getLibrary(c, 'dart:_internal').getType('PrivateSymbol'), | 214 functionClass = coreLibrary.getType('Function'), |
| 214 dartJSLibrary = _getLibrary(c, 'dart:js'); | 215 privateSymbolClass = internalLibrary.getType('PrivateSymbol'), |
| 216 dartJSLibrary = jsLibrary; |
| 215 | 217 |
| 216 Element get currentElement => _currentElements.last; | 218 Element get currentElement => _currentElements.last; |
| 217 | 219 |
| 218 LibraryElement get currentLibrary => currentElement.library; | 220 LibraryElement get currentLibrary => currentElement.library; |
| 219 | 221 |
| 220 /// The main entry point to JavaScript code generation. | 222 /// The main entry point to JavaScript code generation. |
| 221 /// | 223 /// |
| 222 /// Takes the metadata for the build unit, as well as resolved trees and | 224 /// Takes the metadata for the build unit, as well as resolved trees and |
| 223 /// errors, and computes the output module code and optionally the source map. | 225 /// errors, and computes the output module code and optionally the source map. |
| 224 JSModuleFile compile(BuildUnit unit, List<CompilationUnit> compilationUnits, | 226 JSModuleFile compile(BuildUnit unit, List<CompilationUnit> compilationUnits, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 235 return new JSModuleFile(unit.name, errors, options, module, dartApiSummary); | 237 return new JSModuleFile(unit.name, errors, options, module, dartApiSummary); |
| 236 } | 238 } |
| 237 | 239 |
| 238 List<int> _summarizeModule(List<CompilationUnit> units) { | 240 List<int> _summarizeModule(List<CompilationUnit> units) { |
| 239 if (!options.summarizeApi) return null; | 241 if (!options.summarizeApi) return null; |
| 240 | 242 |
| 241 if (!units.any((u) => resolutionMap | 243 if (!units.any((u) => resolutionMap |
| 242 .elementDeclaredByCompilationUnit(u) | 244 .elementDeclaredByCompilationUnit(u) |
| 243 .librarySource | 245 .librarySource |
| 244 .isInSystemLibrary)) { | 246 .isInSystemLibrary)) { |
| 245 var sdk = context.sourceFactory.dartSdk; | 247 var sdk = driver.sourceFactory.dartSdk; |
| 246 summaryData.addBundle( | 248 summaryData.addBundle( |
| 247 null, | 249 null, |
| 248 sdk is SummaryBasedDartSdk | 250 sdk is SummaryBasedDartSdk |
| 249 ? sdk.bundle | 251 ? sdk.bundle |
| 250 : (sdk as FolderBasedDartSdk).getSummarySdkBundle(true)); | 252 : (sdk as FolderBasedDartSdk).getSummarySdkBundle(true)); |
| 251 } | 253 } |
| 252 | 254 |
| 253 var assembler = new PackageBundleAssembler(); | 255 var assembler = new PackageBundleAssembler(); |
| 254 assembler.recordDependencies(summaryData); | 256 assembler.recordDependencies(summaryData); |
| 255 | 257 |
| 256 var uriToUnit = new Map<String, UnlinkedUnit>.fromIterable(units, | 258 var uriToUnit = new Map<String, UnlinkedUnit>.fromIterable(units, |
| 257 key: (u) => u.element.source.uri.toString(), | 259 key: (u) => u.element.source.uri.toString(), |
| 258 value: (unit) { | 260 value: (unit) { |
| 259 var unlinked = serializeAstUnlinked(unit); | 261 var unlinked = serializeAstUnlinked(unit); |
| 260 assembler.addUnlinkedUnit(unit.element.source, unlinked); | 262 assembler.addUnlinkedUnit(unit.element.source, unlinked); |
| 261 return unlinked; | 263 return unlinked; |
| 262 }); | 264 }); |
| 263 | 265 |
| 264 summary_link | 266 summary_link |
| 265 .link( | 267 .link( |
| 266 uriToUnit.keys.toSet(), | 268 uriToUnit.keys.toSet(), |
| 267 (uri) => summaryData.linkedMap[uri], | 269 (uri) => summaryData.linkedMap[uri], |
| 268 (uri) => summaryData.unlinkedMap[uri] ?? uriToUnit[uri], | 270 (uri) => summaryData.unlinkedMap[uri] ?? uriToUnit[uri], |
| 269 context.declaredVariables.get, | 271 driver.declaredVariables.get, |
| 270 true) | 272 true) |
| 271 .forEach(assembler.addLinkedLibrary); | 273 .forEach(assembler.addLinkedLibrary); |
| 272 | 274 |
| 273 var bundle = assembler.assemble(); | 275 var bundle = assembler.assemble(); |
| 274 // Preserve only API-level information in the summary. | 276 // Preserve only API-level information in the summary. |
| 275 bundle.flushInformative(); | 277 bundle.flushInformative(); |
| 276 return bundle.toBuffer(); | 278 return bundle.toBuffer(); |
| 277 } | 279 } |
| 278 | 280 |
| 279 JS.Program _emitModule(List<CompilationUnit> compilationUnits, String name) { | 281 JS.Program _emitModule(List<CompilationUnit> compilationUnits, String name) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 // dart:_runtime has a magic module that holds extension method symbols. | 316 // dart:_runtime has a magic module that holds extension method symbols. |
| 315 // TODO(jmesserly): find a cleaner design for this. | 317 // TODO(jmesserly): find a cleaner design for this. |
| 316 if (isSdkInternalRuntime(library)) { | 318 if (isSdkInternalRuntime(library)) { |
| 317 items.add(new JS.ExportDeclaration(js | 319 items.add(new JS.ExportDeclaration(js |
| 318 .call('const # = Object.create(null)', [_extensionSymbolsModule]))); | 320 .call('const # = Object.create(null)', [_extensionSymbolsModule]))); |
| 319 } | 321 } |
| 320 } | 322 } |
| 321 | 323 |
| 322 // Collect all class/type Element -> Node mappings | 324 // Collect all class/type Element -> Node mappings |
| 323 // in case we need to forward declare any classes. | 325 // in case we need to forward declare any classes. |
| 324 _declarationNodes = new HashMap<TypeDefiningElement, AstNode>.identity(); | 326 _declarationNodes = new HashMap<TypeDefiningElement, AstNode>(); |
| 325 for (var unit in compilationUnits) { | 327 for (var unit in compilationUnits) { |
| 326 for (var declaration in unit.declarations) { | 328 for (var declaration in unit.declarations) { |
| 327 var element = declaration.element; | 329 var element = declaration.element; |
| 328 if (element is TypeDefiningElement) { | 330 if (element is TypeDefiningElement) { |
| 329 _declarationNodes[element] = declaration; | 331 _declarationNodes[element] = declaration; |
| 330 } | 332 } |
| 331 } | 333 } |
| 332 } | 334 } |
| 333 if (compilationUnits.isNotEmpty) { | 335 if (compilationUnits.isNotEmpty) { |
| 334 _constants = new ConstFieldVisitor(context, | 336 _constants = new ConstFieldVisitor(types, driver.declaredVariables, |
| 335 dummySource: resolutionMap | 337 dummySource: resolutionMap |
| 336 .elementDeclaredByCompilationUnit(compilationUnits.first) | 338 .elementDeclaredByCompilationUnit(compilationUnits.first) |
| 337 .source); | 339 .source); |
| 338 } | 340 } |
| 339 | 341 |
| 340 // Add implicit dart:core dependency so it is first. | 342 // Add implicit dart:core dependency so it is first. |
| 341 emitLibraryName(dartCoreLibrary); | 343 emitLibraryName(dartCoreLibrary); |
| 342 | 344 |
| 343 // Visit each compilation unit and emit its code. | 345 // Visit each compilation unit and emit its code. |
| 344 // | 346 // |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 | 544 |
| 543 var last = _currentElements.removeLast(); | 545 var last = _currentElements.removeLast(); |
| 544 assert(identical(e, last)); | 546 assert(identical(e, last)); |
| 545 } | 547 } |
| 546 | 548 |
| 547 /// Start generating top-level code for the element [e]. | 549 /// Start generating top-level code for the element [e]. |
| 548 /// | 550 /// |
| 549 /// Subsequent [emitDeclaration] calls will cause those elements to be | 551 /// Subsequent [emitDeclaration] calls will cause those elements to be |
| 550 /// generated before this one, until [finishTopLevel] is called. | 552 /// generated before this one, until [finishTopLevel] is called. |
| 551 void _startTopLevelCodeForClass(TypeDefiningElement e) { | 553 void _startTopLevelCodeForClass(TypeDefiningElement e) { |
| 552 assert(identical(e, currentElement)); | 554 assert(e == currentElement); |
| 553 _topLevelElements.add(e); | 555 _topLevelElements.add(e); |
| 554 } | 556 } |
| 555 | 557 |
| 556 /// Finishes the top-level code for the element [e]. | 558 /// Finishes the top-level code for the element [e]. |
| 557 void _finishTopLevelCodeForClass(TypeDefiningElement e) { | 559 void _finishTopLevelCodeForClass(TypeDefiningElement e) { |
| 558 var last = _topLevelElements.removeLast(); | 560 var last = _topLevelElements.removeLast(); |
| 559 assert(identical(e, last)); | 561 assert(identical(e, last)); |
| 560 } | 562 } |
| 561 | 563 |
| 562 /// To emit top-level module items, we sometimes need to reorder them. | 564 /// To emit top-level module items, we sometimes need to reorder them. |
| 563 /// | 565 /// |
| 564 /// This function takes care of that, and also detects cases where reordering | 566 /// This function takes care of that, and also detects cases where reordering |
| 565 /// failed, and we need to resort to lazy loading, by marking the element as | 567 /// failed, and we need to resort to lazy loading, by marking the element as |
| 566 /// lazy. All elements need to be aware of this possibility and generate code | 568 /// lazy. All elements need to be aware of this possibility and generate code |
| 567 /// accordingly. | 569 /// accordingly. |
| 568 /// | 570 /// |
| 569 /// If we are not emitting top-level code, this does nothing, because all | 571 /// If we are not emitting top-level code, this does nothing, because all |
| 570 /// declarations are assumed to be available before we start execution. | 572 /// declarations are assumed to be available before we start execution. |
| 571 /// See [startTopLevel]. | 573 /// See [startTopLevel]. |
| 572 void _declareBeforeUse(TypeDefiningElement e) { | 574 void _declareBeforeUse(TypeDefiningElement e) { |
| 573 if (e == null) return; | 575 if (e == null) return; |
| 574 | 576 |
| 575 var topLevel = _topLevelElements; | 577 var topLevel = _topLevelElements; |
| 576 if (topLevel.isNotEmpty && identical(currentElement, topLevel.last)) { | 578 if (topLevel.isNotEmpty && currentElement == topLevel.last) { |
| 577 // If the item is from our library, try to emit it now. | 579 // If the item is from our library, try to emit it now. |
| 578 _emitTypeDeclaration(e); | 580 _emitTypeDeclaration(e); |
| 579 } | 581 } |
| 580 } | 582 } |
| 581 | 583 |
| 582 @override | 584 @override |
| 583 visitCompilationUnit(CompilationUnit unit) { | 585 visitCompilationUnit(CompilationUnit unit) { |
| 584 // NOTE: this method isn't the right place to initialize | 586 // NOTE: this method isn't the right place to initialize |
| 585 // per-compilation-unit state. Declarations can be visited out of order, | 587 // per-compilation-unit state. Declarations can be visited out of order, |
| 586 // this is only to catch things that haven't been emitted yet. | 588 // this is only to catch things that haven't been emitted yet. |
| (...skipping 1326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1913 lookup = classElem.type.lookUpInheritedGetter; | 1915 lookup = classElem.type.lookUpInheritedGetter; |
| 1914 tMember = node.isStatic ? tStaticGetters : tInstanceGetters; | 1916 tMember = node.isStatic ? tStaticGetters : tInstanceGetters; |
| 1915 } else if (node.isSetter) { | 1917 } else if (node.isSetter) { |
| 1916 elementToType = (ExecutableElement element) => element.type; | 1918 elementToType = (ExecutableElement element) => element.type; |
| 1917 getOverride = classElem.lookUpInheritedConcreteSetter; | 1919 getOverride = classElem.lookUpInheritedConcreteSetter; |
| 1918 lookup = classElem.type.lookUpInheritedSetter; | 1920 lookup = classElem.type.lookUpInheritedSetter; |
| 1919 tMember = node.isStatic ? tStaticSetters : tInstanceSetters; | 1921 tMember = node.isStatic ? tStaticSetters : tInstanceSetters; |
| 1920 } else { | 1922 } else { |
| 1921 // Method | 1923 // Method |
| 1922 // Swap in "Object" for parameter types that are covariant overrides. | 1924 // Swap in "Object" for parameter types that are covariant overrides. |
| 1923 var objectType = context.typeProvider.objectType; | 1925 var objectType = types.objectType; |
| 1924 elementToType = | 1926 elementToType = |
| 1925 (MethodElement element) => element.getReifiedType(objectType); | 1927 (MethodElement element) => element.getReifiedType(objectType); |
| 1926 getOverride = classElem.lookUpInheritedConcreteMethod; | 1928 getOverride = classElem.lookUpInheritedConcreteMethod; |
| 1927 lookup = classElem.type.lookUpInheritedMethod; | 1929 lookup = classElem.type.lookUpInheritedMethod; |
| 1928 tMember = node.isStatic ? tStaticMethods : tInstanceMethods; | 1930 tMember = node.isStatic ? tStaticMethods : tInstanceMethods; |
| 1929 } | 1931 } |
| 1930 | 1932 |
| 1931 DartType reifiedType = elementToType(element); | 1933 DartType reifiedType = elementToType(element); |
| 1932 // Don't add redundant signatures for inherited methods whose signature | 1934 // Don't add redundant signatures for inherited methods whose signature |
| 1933 // did not change. If we are not overriding, or if the thing we are | 1935 // did not change. If we are not overriding, or if the thing we are |
| (...skipping 2392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4326 int _asIntInRange(Expression expr, int low, int high) { | 4328 int _asIntInRange(Expression expr, int low, int high) { |
| 4327 expr = expr.unParenthesized; | 4329 expr = expr.unParenthesized; |
| 4328 if (expr is IntegerLiteral) { | 4330 if (expr is IntegerLiteral) { |
| 4329 if (expr.value >= low && expr.value <= high) return expr.value; | 4331 if (expr.value >= low && expr.value <= high) return expr.value; |
| 4330 return null; | 4332 return null; |
| 4331 } | 4333 } |
| 4332 int finishIdentifier(SimpleIdentifier identifier) { | 4334 int finishIdentifier(SimpleIdentifier identifier) { |
| 4333 Element staticElement = identifier.staticElement; | 4335 Element staticElement = identifier.staticElement; |
| 4334 if (staticElement is PropertyAccessorElement && staticElement.isGetter) { | 4336 if (staticElement is PropertyAccessorElement && staticElement.isGetter) { |
| 4335 PropertyInducingElement variable = staticElement.variable; | 4337 PropertyInducingElement variable = staticElement.variable; |
| 4336 int value = variable?.computeConstantValue()?.toIntValue(); | 4338 int value = variable?.constantValue?.toIntValue(); |
| 4337 if (value != null && value >= low && value <= high) return value; | 4339 if (value != null && value >= low && value <= high) return value; |
| 4338 } | 4340 } |
| 4339 return null; | 4341 return null; |
| 4340 } | 4342 } |
| 4341 | 4343 |
| 4342 if (expr is SimpleIdentifier) { | 4344 if (expr is SimpleIdentifier) { |
| 4343 return finishIdentifier(expr); | 4345 return finishIdentifier(expr); |
| 4344 } else if (expr is PrefixedIdentifier && !expr.isDeferred) { | 4346 } else if (expr is PrefixedIdentifier && !expr.isDeferred) { |
| 4345 return finishIdentifier(expr.identifier); | 4347 return finishIdentifier(expr.identifier); |
| 4346 } | 4348 } |
| (...skipping 1560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5907 : super.forNode(name); | 5909 : super.forNode(name); |
| 5908 | 5910 |
| 5909 int get hashCode => identityHashCode(this); | 5911 int get hashCode => identityHashCode(this); |
| 5910 | 5912 |
| 5911 bool operator ==(Object other) => identical(this, other); | 5913 bool operator ==(Object other) => identical(this, other); |
| 5912 } | 5914 } |
| 5913 | 5915 |
| 5914 bool isLibraryPrefix(Expression node) => | 5916 bool isLibraryPrefix(Expression node) => |
| 5915 node is SimpleIdentifier && node.staticElement is PrefixElement; | 5917 node is SimpleIdentifier && node.staticElement is PrefixElement; |
| 5916 | 5918 |
| 5917 LibraryElement _getLibrary(AnalysisContext c, String uri) => | |
| 5918 c.computeLibraryElement(c.sourceFactory.forUri(uri)); | |
| 5919 | |
| 5920 /// Returns `true` if [target] is a prefix for a deferred library and [name] | 5919 /// Returns `true` if [target] is a prefix for a deferred library and [name] |
| 5921 /// is "loadLibrary". | 5920 /// is "loadLibrary". |
| 5922 /// | 5921 /// |
| 5923 /// If so, the expression should be compiled to call the runtime's | 5922 /// If so, the expression should be compiled to call the runtime's |
| 5924 /// "loadLibrary" helper function. | 5923 /// "loadLibrary" helper function. |
| 5925 bool _isDeferredLoadLibrary(Expression target, SimpleIdentifier name) { | 5924 bool _isDeferredLoadLibrary(Expression target, SimpleIdentifier name) { |
| 5926 if (name.name != "loadLibrary") return false; | 5925 if (name.name != "loadLibrary") return false; |
| 5927 | 5926 |
| 5928 if (target is! SimpleIdentifier) return false; | 5927 if (target is! SimpleIdentifier) return false; |
| 5929 var targetIdentifier = target as SimpleIdentifier; | 5928 var targetIdentifier = target as SimpleIdentifier; |
| 5930 | 5929 |
| 5931 if (targetIdentifier.staticElement is! PrefixElement) return false; | 5930 if (targetIdentifier.staticElement is! PrefixElement) return false; |
| 5932 var prefix = targetIdentifier.staticElement as PrefixElement; | 5931 var prefix = targetIdentifier.staticElement as PrefixElement; |
| 5933 | 5932 |
| 5934 // The library the prefix is referring to must come from a deferred import. | 5933 // The library the prefix is referring to must come from a deferred import. |
| 5935 var containingLibrary = resolutionMap | 5934 var containingLibrary = resolutionMap |
| 5936 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) | 5935 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) |
| 5937 .library; | 5936 .library; |
| 5938 var imports = containingLibrary.getImportsWithPrefix(prefix); | 5937 var imports = containingLibrary.getImportsWithPrefix(prefix); |
| 5939 return imports.length == 1 && imports[0].isDeferred; | 5938 return imports.length == 1 && imports[0].isDeferred; |
| 5940 } | 5939 } |
| OLD | NEW |