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

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

Issue 2757753002: Migrate DDC to the new analysis driver.
Patch Set: Rebase Created 3 years, 6 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
OLDNEW
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
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/dev_compiler/lib/src/analyzer/context.dart ('k') | pkg/dev_compiler/lib/src/compiler/command.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698