Index: pkg/dev_compiler/lib/src/compiler/code_generator.dart |
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
index dd31245a4b39b344fa9ae173bce4f26644e2f484..c62aa11e635e922f45cb7278f7ae3701ea1a856d 100644 |
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart |
@@ -14,13 +14,20 @@ import 'package:analyzer/src/dart/ast/token.dart' show StringToken; |
import 'package:analyzer/src/dart/element/element.dart' |
show LocalVariableElementImpl; |
import 'package:analyzer/src/dart/element/type.dart' show DynamicTypeImpl; |
+import 'package:analyzer/src/dart/sdk/sdk.dart'; |
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; |
import 'package:analyzer/src/generated/resolver.dart' |
show TypeProvider, NamespaceBuilder; |
import 'package:analyzer/src/generated/type_system.dart' |
show StrongTypeSystemImpl; |
+import 'package:analyzer/src/summary/idl.dart' show UnlinkedUnit; |
+import 'package:analyzer/src/summary/link.dart' as summary_link; |
+import 'package:analyzer/src/summary/package_bundle_reader.dart'; |
+import 'package:analyzer/src/summary/summarize_ast.dart' |
+ show serializeAstUnlinked; |
import 'package:analyzer/src/summary/summarize_elements.dart' |
show PackageBundleAssembler; |
+import 'package:analyzer/src/summary/summary_sdk.dart'; |
import 'package:analyzer/src/task/strong/ast_properties.dart' |
show isDynamicInvoke, setIsDynamicInvoke; |
import 'package:path/path.dart' show separator; |
@@ -47,6 +54,8 @@ import 'type_utilities.dart'; |
class CodeGenerator extends GeneralizingAstVisitor |
with ClosureAnnotator, JsTypeRefCodegen, NullableTypeInference { |
final AnalysisContext context; |
+ final SummaryDataStore summaryData; |
+ |
final CompilerOptions options; |
final rules = new StrongTypeSystemImpl(); |
@@ -138,7 +147,8 @@ class CodeGenerator extends GeneralizingAstVisitor |
/// Whether we are currently generating code for the body of a `JS()` call. |
bool _isInForeignJS = false; |
- CodeGenerator(AnalysisContext c, this.options, this._extensionTypes) |
+ CodeGenerator( |
+ AnalysisContext c, this.summaryData, this.options, this._extensionTypes) |
: context = c, |
types = c.typeProvider, |
_asyncStreamIterator = |
@@ -175,14 +185,37 @@ class CodeGenerator extends GeneralizingAstVisitor |
return new JSModuleFile(unit.name, errors, options, module, dartApiSummary); |
} |
- List<int> _summarizeModule(List<CompilationUnit> compilationUnits) { |
+ List<int> _summarizeModule(List<CompilationUnit> units) { |
if (!options.summarizeApi) return null; |
+ if (!units.any((u) => u.element.librarySource.isInSystemLibrary)) { |
+ var sdk = context.sourceFactory.dartSdk; |
+ summaryData.addBundle( |
+ null, |
+ sdk is SummaryBasedDartSdk |
+ ? sdk.bundle |
+ : (sdk as FolderBasedDartSdk).getSummarySdkBundle(true)); |
+ } |
+ |
var assembler = new PackageBundleAssembler(); |
- compilationUnits |
- .map((u) => u.element.library) |
- .toSet() |
- .forEach(assembler.serializeLibraryElement); |
+ assembler.recordDependencies(summaryData); |
+ |
+ var uriToUnit = new Map<String, UnlinkedUnit>.fromIterable(units, |
+ key: (u) => u.element.source.uri.toString(), value: (unit) { |
+ var unlinked = serializeAstUnlinked(unit); |
+ assembler.addUnlinkedUnit(unit.element.source, unlinked); |
+ return unlinked; |
+ }); |
+ |
+ summary_link |
+ .link( |
+ uriToUnit.keys.toSet(), |
+ (uri) => summaryData.linkedMap[uri], |
+ (uri) => summaryData.unlinkedMap[uri] ?? uriToUnit[uri], |
+ context.declaredVariables.get, |
+ true) |
+ .forEach(assembler.addLinkedLibrary); |
+ |
return assembler.assemble().toBuffer(); |
} |