| Index: pkg/analyzer/lib/src/summary/summary_file_builder.dart
|
| diff --git a/pkg/analyzer/lib/src/summary/summary_file_builder.dart b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
|
| index ad03a10960e611d9364583823a45e5fe73859b9c..d27133f55ef2a4d5d37af5a2763fe8dc7a8c245c 100644
|
| --- a/pkg/analyzer/lib/src/summary/summary_file_builder.dart
|
| +++ b/pkg/analyzer/lib/src/summary/summary_file_builder.dart
|
| @@ -6,13 +6,22 @@ library analyzer.src.summary.summary_file_builder;
|
|
|
| import 'dart:collection';
|
|
|
| -import 'package:analyzer/dart/element/element.dart';
|
| +import 'package:analyzer/dart/ast/ast.dart';
|
| +import 'package:analyzer/dart/ast/token.dart';
|
| +import 'package:analyzer/error/listener.dart';
|
| import 'package:analyzer/file_system/file_system.dart';
|
| import 'package:analyzer/file_system/physical_file_system.dart';
|
| +import 'package:analyzer/src/dart/scanner/reader.dart';
|
| +import 'package:analyzer/src/dart/scanner/scanner.dart';
|
| import 'package:analyzer/src/dart/sdk/sdk.dart';
|
| import 'package:analyzer/src/generated/engine.dart';
|
| +import 'package:analyzer/src/generated/parser.dart';
|
| import 'package:analyzer/src/generated/sdk.dart';
|
| import 'package:analyzer/src/generated/source.dart';
|
| +import 'package:analyzer/src/summary/format.dart';
|
| +import 'package:analyzer/src/summary/idl.dart';
|
| +import 'package:analyzer/src/summary/link.dart';
|
| +import 'package:analyzer/src/summary/summarize_ast.dart';
|
| import 'package:analyzer/src/summary/summarize_elements.dart';
|
|
|
| class SummaryBuilder {
|
| @@ -59,37 +68,83 @@ class SummaryBuilder {
|
| /**
|
| * Build the linked bundle and return its bytes.
|
| */
|
| - List<int> build() => new _Builder(context, librarySources).build();
|
| + List<int> build() => new _Builder(context, librarySources, strong).build();
|
| }
|
|
|
| class _Builder {
|
| final AnalysisContext context;
|
| final Iterable<Source> librarySources;
|
| + final bool strong;
|
| +
|
| + final Set<String> libraryUris = new Set<String>();
|
| + final Map<String, UnlinkedUnit> unlinkedMap = <String, UnlinkedUnit>{};
|
|
|
| - final Set<Source> processedSources = new Set<Source>();
|
| final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler();
|
|
|
| - _Builder(this.context, this.librarySources);
|
| + _Builder(this.context, this.librarySources, this.strong);
|
|
|
| /**
|
| * Build the linked bundle and return its bytes.
|
| */
|
| List<int> build() {
|
| - librarySources.forEach(_serializeLibrary);
|
| + librarySources.forEach(_addLibrary);
|
| +
|
| + Map<String, LinkedLibraryBuilder> map = link(libraryUris, (uri) {
|
| + throw new StateError('Unexpected call to GetDependencyCallback($uri).');
|
| + }, (uri) {
|
| + UnlinkedUnit unlinked = unlinkedMap[uri];
|
| + if (unlinked == null) {
|
| + throw new StateError('Unable to find unresolved unit $uri.');
|
| + }
|
| + return unlinked;
|
| + }, (String name) {
|
| + throw new StateError('Unexpected call to GetDeclaredVariable($name).');
|
| + }, strong);
|
| + map.forEach(bundleAssembler.addLinkedLibrary);
|
| +
|
| return bundleAssembler.assemble().toBuffer();
|
| }
|
|
|
| - /**
|
| - * Serialize the library with the given [source] and all its direct or
|
| - * indirect imports and exports.
|
| - */
|
| - void _serializeLibrary(Source source) {
|
| - if (!processedSources.add(source)) {
|
| + void _addLibrary(Source source) {
|
| + String uriStr = source.uri.toString();
|
| + if (!libraryUris.add(uriStr)) {
|
| return;
|
| }
|
| - LibraryElement element = context.computeLibraryElement(source);
|
| - bundleAssembler.serializeLibraryElement(element);
|
| - element.importedLibraries.forEach((e) => _serializeLibrary(e.source));
|
| - element.exportedLibraries.forEach((e) => _serializeLibrary(e.source));
|
| + CompilationUnit unit = _addUnlinked(source);
|
| + for (Directive directive in unit.directives) {
|
| + if (directive is NamespaceDirective) {
|
| + String libUri = directive.uri.stringValue;
|
| + Source libSource = context.sourceFactory.resolveUri(source, libUri);
|
| + _addLibrary(libSource);
|
| + } else if (directive is PartDirective) {
|
| + String partUri = directive.uri.stringValue;
|
| + Source partSource = context.sourceFactory.resolveUri(source, partUri);
|
| + _addUnlinked(partSource);
|
| + }
|
| + }
|
| + }
|
| +
|
| + CompilationUnit _addUnlinked(Source source) {
|
| + String uriStr = source.uri.toString();
|
| + CompilationUnit unit = _parse(source);
|
| + UnlinkedUnitBuilder unlinked = serializeAstUnlinked(unit);
|
| + unlinkedMap[uriStr] = unlinked;
|
| + bundleAssembler.addUnlinkedUnit(source, unlinked);
|
| + return unit;
|
| + }
|
| +
|
| + CompilationUnit _parse(Source source) {
|
| + AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
|
| + String code = source.contents.data;
|
| + CharSequenceReader reader = new CharSequenceReader(code);
|
| + Scanner scanner = new Scanner(source, reader, errorListener);
|
| + scanner.scanGenericMethodComments = strong;
|
| + Token token = scanner.tokenize();
|
| + LineInfo lineInfo = new LineInfo(scanner.lineStarts);
|
| + Parser parser = new Parser(source, errorListener);
|
| + parser.parseGenericMethodComments = strong;
|
| + CompilationUnit unit = parser.parseCompilationUnit(token);
|
| + unit.lineInfo = lineInfo;
|
| + return unit;
|
| }
|
| }
|
|
|