| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.src.summary.summary_file_builder; | 5 library analyzer.src.summary.summary_file_builder; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/element/element.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; |
| 11 import 'package:analyzer/error/listener.dart'; |
| 10 import 'package:analyzer/file_system/file_system.dart'; | 12 import 'package:analyzer/file_system/file_system.dart'; |
| 11 import 'package:analyzer/file_system/physical_file_system.dart'; | 13 import 'package:analyzer/file_system/physical_file_system.dart'; |
| 14 import 'package:analyzer/src/dart/scanner/reader.dart'; |
| 15 import 'package:analyzer/src/dart/scanner/scanner.dart'; |
| 12 import 'package:analyzer/src/dart/sdk/sdk.dart'; | 16 import 'package:analyzer/src/dart/sdk/sdk.dart'; |
| 13 import 'package:analyzer/src/generated/engine.dart'; | 17 import 'package:analyzer/src/generated/engine.dart'; |
| 18 import 'package:analyzer/src/generated/parser.dart'; |
| 14 import 'package:analyzer/src/generated/sdk.dart'; | 19 import 'package:analyzer/src/generated/sdk.dart'; |
| 15 import 'package:analyzer/src/generated/source.dart'; | 20 import 'package:analyzer/src/generated/source.dart'; |
| 21 import 'package:analyzer/src/summary/format.dart'; |
| 22 import 'package:analyzer/src/summary/idl.dart'; |
| 23 import 'package:analyzer/src/summary/link.dart'; |
| 24 import 'package:analyzer/src/summary/summarize_ast.dart'; |
| 16 import 'package:analyzer/src/summary/summarize_elements.dart'; | 25 import 'package:analyzer/src/summary/summarize_elements.dart'; |
| 17 | 26 |
| 18 class SummaryBuilder { | 27 class SummaryBuilder { |
| 19 final Iterable<Source> librarySources; | 28 final Iterable<Source> librarySources; |
| 20 final AnalysisContext context; | 29 final AnalysisContext context; |
| 21 final bool strong; | 30 final bool strong; |
| 22 | 31 |
| 23 /** | 32 /** |
| 24 * Create a summary builder for these [librarySources] and [context]. | 33 * Create a summary builder for these [librarySources] and [context]. |
| 25 */ | 34 */ |
| (...skipping 26 matching lines...) Expand all Loading... |
| 52 for (String uri in uriSet) { | 61 for (String uri in uriSet) { |
| 53 librarySources.add(sdk.mapDartUri(uri)); | 62 librarySources.add(sdk.mapDartUri(uri)); |
| 54 } | 63 } |
| 55 | 64 |
| 56 return new SummaryBuilder(librarySources, sdk.context, strong); | 65 return new SummaryBuilder(librarySources, sdk.context, strong); |
| 57 } | 66 } |
| 58 | 67 |
| 59 /** | 68 /** |
| 60 * Build the linked bundle and return its bytes. | 69 * Build the linked bundle and return its bytes. |
| 61 */ | 70 */ |
| 62 List<int> build() => new _Builder(context, librarySources).build(); | 71 List<int> build() => new _Builder(context, librarySources, strong).build(); |
| 63 } | 72 } |
| 64 | 73 |
| 65 class _Builder { | 74 class _Builder { |
| 66 final AnalysisContext context; | 75 final AnalysisContext context; |
| 67 final Iterable<Source> librarySources; | 76 final Iterable<Source> librarySources; |
| 77 final bool strong; |
| 68 | 78 |
| 69 final Set<Source> processedSources = new Set<Source>(); | 79 final Set<String> libraryUris = new Set<String>(); |
| 80 final Map<String, UnlinkedUnit> unlinkedMap = <String, UnlinkedUnit>{}; |
| 81 |
| 70 final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler(); | 82 final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler(); |
| 71 | 83 |
| 72 _Builder(this.context, this.librarySources); | 84 _Builder(this.context, this.librarySources, this.strong); |
| 73 | 85 |
| 74 /** | 86 /** |
| 75 * Build the linked bundle and return its bytes. | 87 * Build the linked bundle and return its bytes. |
| 76 */ | 88 */ |
| 77 List<int> build() { | 89 List<int> build() { |
| 78 librarySources.forEach(_serializeLibrary); | 90 librarySources.forEach(_addLibrary); |
| 91 |
| 92 Map<String, LinkedLibraryBuilder> map = link(libraryUris, (uri) { |
| 93 throw new StateError('Unexpected call to GetDependencyCallback($uri).'); |
| 94 }, (uri) { |
| 95 UnlinkedUnit unlinked = unlinkedMap[uri]; |
| 96 if (unlinked == null) { |
| 97 throw new StateError('Unable to find unresolved unit $uri.'); |
| 98 } |
| 99 return unlinked; |
| 100 }, (String name) { |
| 101 throw new StateError('Unexpected call to GetDeclaredVariable($name).'); |
| 102 }, strong); |
| 103 map.forEach(bundleAssembler.addLinkedLibrary); |
| 104 |
| 79 return bundleAssembler.assemble().toBuffer(); | 105 return bundleAssembler.assemble().toBuffer(); |
| 80 } | 106 } |
| 81 | 107 |
| 82 /** | 108 void _addLibrary(Source source) { |
| 83 * Serialize the library with the given [source] and all its direct or | 109 String uriStr = source.uri.toString(); |
| 84 * indirect imports and exports. | 110 if (!libraryUris.add(uriStr)) { |
| 85 */ | |
| 86 void _serializeLibrary(Source source) { | |
| 87 if (!processedSources.add(source)) { | |
| 88 return; | 111 return; |
| 89 } | 112 } |
| 90 LibraryElement element = context.computeLibraryElement(source); | 113 CompilationUnit unit = _addUnlinked(source); |
| 91 bundleAssembler.serializeLibraryElement(element); | 114 for (Directive directive in unit.directives) { |
| 92 element.importedLibraries.forEach((e) => _serializeLibrary(e.source)); | 115 if (directive is NamespaceDirective) { |
| 93 element.exportedLibraries.forEach((e) => _serializeLibrary(e.source)); | 116 String libUri = directive.uri.stringValue; |
| 117 Source libSource = context.sourceFactory.resolveUri(source, libUri); |
| 118 _addLibrary(libSource); |
| 119 } else if (directive is PartDirective) { |
| 120 String partUri = directive.uri.stringValue; |
| 121 Source partSource = context.sourceFactory.resolveUri(source, partUri); |
| 122 _addUnlinked(partSource); |
| 123 } |
| 124 } |
| 125 } |
| 126 |
| 127 CompilationUnit _addUnlinked(Source source) { |
| 128 String uriStr = source.uri.toString(); |
| 129 CompilationUnit unit = _parse(source); |
| 130 UnlinkedUnitBuilder unlinked = serializeAstUnlinked(unit); |
| 131 unlinkedMap[uriStr] = unlinked; |
| 132 bundleAssembler.addUnlinkedUnit(source, unlinked); |
| 133 return unit; |
| 134 } |
| 135 |
| 136 CompilationUnit _parse(Source source) { |
| 137 AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER; |
| 138 String code = source.contents.data; |
| 139 CharSequenceReader reader = new CharSequenceReader(code); |
| 140 Scanner scanner = new Scanner(source, reader, errorListener); |
| 141 scanner.scanGenericMethodComments = strong; |
| 142 Token token = scanner.tokenize(); |
| 143 LineInfo lineInfo = new LineInfo(scanner.lineStarts); |
| 144 Parser parser = new Parser(source, errorListener); |
| 145 parser.parseGenericMethodComments = strong; |
| 146 CompilationUnit unit = parser.parseCompilationUnit(token); |
| 147 unit.lineInfo = lineInfo; |
| 148 return unit; |
| 94 } | 149 } |
| 95 } | 150 } |
| OLD | NEW |