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'; |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 null, | 247 null, |
248 sdk is SummaryBasedDartSdk | 248 sdk is SummaryBasedDartSdk |
249 ? sdk.bundle | 249 ? sdk.bundle |
250 : (sdk as FolderBasedDartSdk).getSummarySdkBundle(true)); | 250 : (sdk as FolderBasedDartSdk).getSummarySdkBundle(true)); |
251 } | 251 } |
252 | 252 |
253 var assembler = new PackageBundleAssembler(); | 253 var assembler = new PackageBundleAssembler(); |
254 assembler.recordDependencies(summaryData); | 254 assembler.recordDependencies(summaryData); |
255 | 255 |
256 var uriToUnit = new Map<String, UnlinkedUnit>.fromIterable(units, | 256 var uriToUnit = new Map<String, UnlinkedUnit>.fromIterable(units, |
257 key: (u) => u.element.source.uri.toString(), value: (unit) { | 257 key: (u) => u.element.source.uri.toString(), |
258 var unlinked = serializeAstUnlinked(unit); | 258 value: (unit) { |
259 assembler.addUnlinkedUnit(unit.element.source, unlinked); | 259 var unlinked = serializeAstUnlinked(unit); |
260 return unlinked; | 260 assembler.addUnlinkedUnit(unit.element.source, unlinked); |
261 }); | 261 return unlinked; |
| 262 }); |
262 | 263 |
263 summary_link | 264 summary_link |
264 .link( | 265 .link( |
265 uriToUnit.keys.toSet(), | 266 uriToUnit.keys.toSet(), |
266 (uri) => summaryData.linkedMap[uri], | 267 (uri) => summaryData.linkedMap[uri], |
267 (uri) => summaryData.unlinkedMap[uri] ?? uriToUnit[uri], | 268 (uri) => summaryData.unlinkedMap[uri] ?? uriToUnit[uri], |
268 context.declaredVariables.get, | 269 context.declaredVariables.get, |
269 true) | 270 true) |
270 .forEach(assembler.addLinkedLibrary); | 271 .forEach(assembler.addLinkedLibrary); |
271 | 272 |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 [jsParams, _constructorName(parentCtor), jsParams]) as JS.Fun; | 813 [jsParams, _constructorName(parentCtor), jsParams]) as JS.Fun; |
813 methods.add(new JS.Method(_constructorName(ctor), fun)); | 814 methods.add(new JS.Method(_constructorName(ctor), fun)); |
814 } | 815 } |
815 } | 816 } |
816 | 817 |
817 var typeFormals = element.typeParameters; | 818 var typeFormals = element.typeParameters; |
818 var isGeneric = typeFormals.isNotEmpty; | 819 var isGeneric = typeFormals.isNotEmpty; |
819 var className = isGeneric ? element.name : _emitTopLevelName(element); | 820 var className = isGeneric ? element.name : _emitTopLevelName(element); |
820 JS.Statement declareInterfaces(JS.Statement decl) { | 821 JS.Statement declareInterfaces(JS.Statement decl) { |
821 if (element.interfaces.isNotEmpty) { | 822 if (element.interfaces.isNotEmpty) { |
822 var body = [decl] | 823 var body = [decl]..add(js.statement('#[#.implements] = () => #;', [ |
823 ..add(js.statement('#[#.implements] = () => #;', [ | |
824 className, | 824 className, |
825 _runtimeModule, | 825 _runtimeModule, |
826 new JS.ArrayInitializer( | 826 new JS.ArrayInitializer( |
827 new List<JS.Expression>.from(element.interfaces.map(_emitType))) | 827 new List<JS.Expression>.from(element.interfaces.map(_emitType))) |
828 ])); | 828 ])); |
829 decl = _statement(body); | 829 decl = _statement(body); |
830 } | 830 } |
831 return decl; | 831 return decl; |
832 } | 832 } |
833 | 833 |
(...skipping 1636 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2470 if (JS.Return.foundIn(fn)) { | 2470 if (JS.Return.foundIn(fn)) { |
2471 // If a return is inside body, transform `(params) { body }` to | 2471 // If a return is inside body, transform `(params) { body }` to |
2472 // `(params) { (() => { body })(); return value; }`. | 2472 // `(params) { (() => { body })(); return value; }`. |
2473 // TODO(jmesserly): we could instead generate the return differently, | 2473 // TODO(jmesserly): we could instead generate the return differently, |
2474 // and avoid the immediately invoked function. | 2474 // and avoid the immediately invoked function. |
2475 body = new JS.Call(new JS.ArrowFun([], fn.body), []).toStatement(); | 2475 body = new JS.Call(new JS.ArrowFun([], fn.body), []).toStatement(); |
2476 } | 2476 } |
2477 // Rewrite the function to include the return. | 2477 // Rewrite the function to include the return. |
2478 return new JS.Fun( | 2478 return new JS.Fun( |
2479 fn.params, new JS.Block([body, new JS.Return(fn.params.last)]), | 2479 fn.params, new JS.Block([body, new JS.Return(fn.params.last)]), |
2480 typeParams: fn.typeParams, | 2480 typeParams: fn.typeParams, returnType: fn.returnType) |
2481 returnType: fn.returnType)..sourceInformation = fn.sourceInformation; | 2481 ..sourceInformation = fn.sourceInformation; |
2482 } | 2482 } |
2483 | 2483 |
2484 @override | 2484 @override |
2485 JS.Statement visitFunctionDeclaration(FunctionDeclaration node) { | 2485 JS.Statement visitFunctionDeclaration(FunctionDeclaration node) { |
2486 assert(node.parent is CompilationUnit); | 2486 assert(node.parent is CompilationUnit); |
2487 | 2487 |
2488 if (_externalOrNative(node)) return null; | 2488 if (_externalOrNative(node)) return null; |
2489 | 2489 |
2490 if (node.isGetter || node.isSetter) { | 2490 if (node.isGetter || node.isSetter) { |
2491 PropertyAccessorElement element = node.element; | 2491 PropertyAccessorElement element = node.element; |
(...skipping 3626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6118 if (targetIdentifier.staticElement is! PrefixElement) return false; | 6118 if (targetIdentifier.staticElement is! PrefixElement) return false; |
6119 var prefix = targetIdentifier.staticElement as PrefixElement; | 6119 var prefix = targetIdentifier.staticElement as PrefixElement; |
6120 | 6120 |
6121 // The library the prefix is referring to must come from a deferred import. | 6121 // The library the prefix is referring to must come from a deferred import. |
6122 var containingLibrary = resolutionMap | 6122 var containingLibrary = resolutionMap |
6123 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) | 6123 .elementDeclaredByCompilationUnit(target.root as CompilationUnit) |
6124 .library; | 6124 .library; |
6125 var imports = containingLibrary.getImportsWithPrefix(prefix); | 6125 var imports = containingLibrary.getImportsWithPrefix(prefix); |
6126 return imports.length == 1 && imports[0].isDeferred; | 6126 return imports.length == 1 && imports[0].isDeferred; |
6127 } | 6127 } |
OLD | NEW |