OLD | NEW |
1 import 'dart:io' as io; | 1 import 'dart:io' as io; |
2 | 2 |
3 import 'package:analyzer/dart/element/element.dart'; | 3 import 'package:analyzer/dart/element/element.dart'; |
4 import 'package:analyzer/src/context/cache.dart'; | 4 import 'package:analyzer/src/context/cache.dart'; |
5 import 'package:analyzer/src/context/context.dart'; | 5 import 'package:analyzer/src/context/context.dart'; |
6 import 'package:analyzer/src/dart/element/element.dart'; | 6 import 'package:analyzer/src/dart/element/element.dart'; |
7 import 'package:analyzer/src/generated/engine.dart'; | 7 import 'package:analyzer/src/generated/engine.dart'; |
8 import 'package:analyzer/src/generated/java_io.dart'; | 8 import 'package:analyzer/src/generated/java_io.dart'; |
9 import 'package:analyzer/src/generated/resolver.dart'; | 9 import 'package:analyzer/src/generated/resolver.dart'; |
10 import 'package:analyzer/src/generated/source.dart'; | 10 import 'package:analyzer/src/generated/source.dart'; |
11 import 'package:analyzer/src/generated/source_io.dart'; | 11 import 'package:analyzer/src/generated/source_io.dart'; |
12 import 'package:analyzer/src/summary/idl.dart'; | 12 import 'package:analyzer/src/summary/idl.dart'; |
13 import 'package:analyzer/src/summary/resynthesize.dart'; | 13 import 'package:analyzer/src/summary/resynthesize.dart'; |
14 import 'package:analyzer/src/summary/summary_sdk.dart'; | 14 import 'package:analyzer/src/summary/summary_sdk.dart'; |
15 import 'package:analyzer/src/task/dart.dart'; | 15 import 'package:analyzer/src/task/dart.dart'; |
16 import 'package:analyzer/task/dart.dart'; | 16 import 'package:analyzer/task/dart.dart'; |
17 import 'package:analyzer/task/model.dart'; | 17 import 'package:analyzer/task/model.dart'; |
18 import 'package:path/path.dart' as pathos; | 18 import 'package:path/path.dart' as pathos; |
19 | 19 |
20 /** | 20 /** |
21 * The [ResultProvider] that provides results from input package summaries. | 21 * The [ResultProvider] that provides results from input package summaries. |
22 */ | 22 */ |
23 class InputPackagesResultProvider extends ResultProvider { | 23 class InputPackagesResultProvider extends ResynthesizerResultProvider { |
24 final InternalAnalysisContext _context; | 24 InputPackagesResultProvider( |
25 | 25 InternalAnalysisContext context, SummaryDataStore dataStore) |
26 _FileBasedSummaryResynthesizer _resynthesizer; | 26 : super(context, dataStore) { |
27 SummaryResultProvider _sdkProvider; | 27 AnalysisContext sdkContext = context.sourceFactory.dartSdk.context; |
28 | 28 createResynthesizer(sdkContext, sdkContext.typeProvider); |
29 InputPackagesResultProvider(this._context, SummaryDataStore dataStore) { | |
30 InternalAnalysisContext sdkContext = _context.sourceFactory.dartSdk.context; | |
31 _sdkProvider = sdkContext.resultProvider; | |
32 // Set the type provider to prevent the context from computing it. | |
33 _context.typeProvider = sdkContext.typeProvider; | |
34 // Create a chained resynthesizer. | |
35 _resynthesizer = new _FileBasedSummaryResynthesizer( | |
36 _sdkProvider.resynthesizer, | |
37 _context, | |
38 _context.typeProvider, | |
39 _context.sourceFactory, | |
40 _context.analysisOptions.strongMode, | |
41 dataStore); | |
42 } | 29 } |
43 | 30 |
44 @override | 31 @override |
45 bool compute(CacheEntry entry, ResultDescriptor result) { | 32 bool hasResultsForSource(Source source) { |
46 if (_sdkProvider.compute(entry, result)) { | 33 String uriString = source.uri.toString(); |
47 return true; | 34 return resynthesizer.hasLibrarySummary(uriString); |
48 } | |
49 AnalysisTarget target = entry.target; | |
50 // Only library results are supported for now. | |
51 if (target is Source) { | |
52 Uri uri = target.uri; | |
53 // We know how to server results to input packages. | |
54 String uriString = uri.toString(); | |
55 if (!_resynthesizer.hasLibrarySummary(uriString)) { | |
56 return false; | |
57 } | |
58 // Provide known results. | |
59 if (result == LIBRARY_ELEMENT1 || | |
60 result == LIBRARY_ELEMENT2 || | |
61 result == LIBRARY_ELEMENT3 || | |
62 result == LIBRARY_ELEMENT4 || | |
63 result == LIBRARY_ELEMENT5 || | |
64 result == LIBRARY_ELEMENT6 || | |
65 result == LIBRARY_ELEMENT7 || | |
66 result == LIBRARY_ELEMENT8 || | |
67 result == LIBRARY_ELEMENT9 || | |
68 result == LIBRARY_ELEMENT || | |
69 false) { | |
70 LibraryElement libraryElement = | |
71 _resynthesizer.getLibraryElement(uriString); | |
72 entry.setValue(result, libraryElement, TargetedResult.EMPTY_LIST); | |
73 return true; | |
74 } else if (result == READY_LIBRARY_ELEMENT2 || | |
75 result == READY_LIBRARY_ELEMENT6 || | |
76 result == READY_LIBRARY_ELEMENT7) { | |
77 entry.setValue(result, true, TargetedResult.EMPTY_LIST); | |
78 return true; | |
79 } else if (result == SOURCE_KIND) { | |
80 if (_resynthesizer._dataStore.linkedMap.containsKey(uriString)) { | |
81 entry.setValue(result, SourceKind.LIBRARY, TargetedResult.EMPTY_LIST); | |
82 return true; | |
83 } | |
84 if (_resynthesizer._dataStore.unlinkedMap.containsKey(uriString)) { | |
85 entry.setValue(result, SourceKind.PART, TargetedResult.EMPTY_LIST); | |
86 return true; | |
87 } | |
88 return false; | |
89 } | |
90 } else if (target is LibrarySpecificUnit) { | |
91 String uriString = target.library.uri.toString(); | |
92 if (!_resynthesizer.hasLibrarySummary(uriString)) { | |
93 return false; | |
94 } | |
95 if (result == CREATED_RESOLVED_UNIT1 || | |
96 result == CREATED_RESOLVED_UNIT2 || | |
97 result == CREATED_RESOLVED_UNIT3 || | |
98 result == CREATED_RESOLVED_UNIT4 || | |
99 result == CREATED_RESOLVED_UNIT5 || | |
100 result == CREATED_RESOLVED_UNIT6 || | |
101 result == CREATED_RESOLVED_UNIT7 || | |
102 result == CREATED_RESOLVED_UNIT8 || | |
103 result == CREATED_RESOLVED_UNIT9 || | |
104 result == CREATED_RESOLVED_UNIT10 || | |
105 result == CREATED_RESOLVED_UNIT11 || | |
106 result == CREATED_RESOLVED_UNIT12) { | |
107 entry.setValue(result, true, TargetedResult.EMPTY_LIST); | |
108 return true; | |
109 } | |
110 if (result == COMPILATION_UNIT_ELEMENT) { | |
111 String libraryUri = target.library.uri.toString(); | |
112 String unitUri = target.unit.uri.toString(); | |
113 CompilationUnitElement unit = _resynthesizer.getElement( | |
114 new ElementLocationImpl.con3(<String>[libraryUri, unitUri])); | |
115 if (unit != null) { | |
116 entry.setValue(result, unit, TargetedResult.EMPTY_LIST); | |
117 return true; | |
118 } | |
119 } | |
120 } else if (target is VariableElement) { | |
121 if (!_resynthesizer | |
122 .hasLibrarySummary(target.library.source.uri.toString())) { | |
123 return false; | |
124 } | |
125 if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) { | |
126 entry.setValue(result, target, TargetedResult.EMPTY_LIST); | |
127 return true; | |
128 } | |
129 } | |
130 return false; | |
131 } | 35 } |
132 } | 36 } |
133 | 37 |
134 /** | 38 /** |
135 * The [UriResolver] that knows about sources that are served from their | 39 * The [UriResolver] that knows about sources that are served from their |
136 * summaries. | 40 * summaries. |
137 * | 41 * |
138 * TODO(scheglov) rename to `InSummaryUriResolver` - it's not `package:` specifi
c. | 42 * TODO(scheglov) rename to `InSummaryUriResolver` - it's not `package:` specifi
c. |
139 */ | 43 */ |
140 class InSummaryPackageUriResolver extends UriResolver { | 44 class InSummaryPackageUriResolver extends UriResolver { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 object is InSummarySource && object.uri == uri; | 108 object is InSummarySource && object.uri == uri; |
205 | 109 |
206 @override | 110 @override |
207 bool exists() => true; | 111 bool exists() => true; |
208 | 112 |
209 @override | 113 @override |
210 String toString() => uri.toString(); | 114 String toString() => uri.toString(); |
211 } | 115 } |
212 | 116 |
213 /** | 117 /** |
| 118 * The [ResultProvider] that provides results using summary resynthesizer. |
| 119 */ |
| 120 abstract class ResynthesizerResultProvider extends ResultProvider { |
| 121 final InternalAnalysisContext _context; |
| 122 final SummaryDataStore _dataStore; |
| 123 |
| 124 _FileBasedSummaryResynthesizer _resynthesizer; |
| 125 SummaryResultProvider _sdkProvider; |
| 126 |
| 127 ResynthesizerResultProvider(this._context, this._dataStore); |
| 128 |
| 129 SummaryResynthesizer get resynthesizer => _resynthesizer; |
| 130 |
| 131 /** |
| 132 * Add a new [bundle] to the resynthesizer. |
| 133 */ |
| 134 void addBundle(String path, PackageBundle bundle) { |
| 135 _dataStore.addBundle(path, bundle); |
| 136 } |
| 137 |
| 138 @override |
| 139 bool compute(CacheEntry entry, ResultDescriptor result) { |
| 140 if (_sdkProvider != null && _sdkProvider.compute(entry, result)) { |
| 141 return true; |
| 142 } |
| 143 AnalysisTarget target = entry.target; |
| 144 // Check whether there are results for the source. |
| 145 if (!hasResultsForSource(target.source)) { |
| 146 return false; |
| 147 } |
| 148 // Constant expressions are always resolved in summaries. |
| 149 if (result == CONSTANT_EXPRESSION_RESOLVED && |
| 150 target is ConstantEvaluationTarget) { |
| 151 entry.setValue(result, true, TargetedResult.EMPTY_LIST); |
| 152 return true; |
| 153 } |
| 154 // Provide results for Source. |
| 155 if (target is Source) { |
| 156 String uriString = target.uri.toString(); |
| 157 // Provide known results. |
| 158 if (result == LIBRARY_ELEMENT1 || |
| 159 result == LIBRARY_ELEMENT2 || |
| 160 result == LIBRARY_ELEMENT3 || |
| 161 result == LIBRARY_ELEMENT4 || |
| 162 result == LIBRARY_ELEMENT5 || |
| 163 result == LIBRARY_ELEMENT6 || |
| 164 result == LIBRARY_ELEMENT7 || |
| 165 result == LIBRARY_ELEMENT8 || |
| 166 result == LIBRARY_ELEMENT9 || |
| 167 result == LIBRARY_ELEMENT) { |
| 168 LibraryElement libraryElement = |
| 169 resynthesizer.getLibraryElement(uriString); |
| 170 entry.setValue(result, libraryElement, TargetedResult.EMPTY_LIST); |
| 171 return true; |
| 172 } else if (result == READY_LIBRARY_ELEMENT2 || |
| 173 result == READY_LIBRARY_ELEMENT6 || |
| 174 result == READY_LIBRARY_ELEMENT7) { |
| 175 entry.setValue(result, true, TargetedResult.EMPTY_LIST); |
| 176 return true; |
| 177 } else if (result == SOURCE_KIND) { |
| 178 if (_dataStore.linkedMap.containsKey(uriString)) { |
| 179 entry.setValue(result, SourceKind.LIBRARY, TargetedResult.EMPTY_LIST); |
| 180 return true; |
| 181 } |
| 182 if (_dataStore.unlinkedMap.containsKey(uriString)) { |
| 183 entry.setValue(result, SourceKind.PART, TargetedResult.EMPTY_LIST); |
| 184 return true; |
| 185 } |
| 186 return false; |
| 187 } |
| 188 } else if (target is LibrarySpecificUnit) { |
| 189 if (!hasResultsForSource(target.library)) { |
| 190 return false; |
| 191 } |
| 192 if (result == CREATED_RESOLVED_UNIT1 || |
| 193 result == CREATED_RESOLVED_UNIT2 || |
| 194 result == CREATED_RESOLVED_UNIT3 || |
| 195 result == CREATED_RESOLVED_UNIT4 || |
| 196 result == CREATED_RESOLVED_UNIT5 || |
| 197 result == CREATED_RESOLVED_UNIT6 || |
| 198 result == CREATED_RESOLVED_UNIT7 || |
| 199 result == CREATED_RESOLVED_UNIT8 || |
| 200 result == CREATED_RESOLVED_UNIT9 || |
| 201 result == CREATED_RESOLVED_UNIT10 || |
| 202 result == CREATED_RESOLVED_UNIT11 || |
| 203 result == CREATED_RESOLVED_UNIT12) { |
| 204 entry.setValue(result, true, TargetedResult.EMPTY_LIST); |
| 205 return true; |
| 206 } |
| 207 if (result == COMPILATION_UNIT_ELEMENT) { |
| 208 String libraryUri = target.library.uri.toString(); |
| 209 String unitUri = target.unit.uri.toString(); |
| 210 CompilationUnitElement unit = resynthesizer.getElement( |
| 211 new ElementLocationImpl.con3(<String>[libraryUri, unitUri])); |
| 212 if (unit != null) { |
| 213 entry.setValue(result, unit, TargetedResult.EMPTY_LIST); |
| 214 return true; |
| 215 } |
| 216 } |
| 217 } else if (target is VariableElement) { |
| 218 if (!hasResultsForSource(target.library.source)) { |
| 219 return false; |
| 220 } |
| 221 if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) { |
| 222 entry.setValue(result, target, TargetedResult.EMPTY_LIST); |
| 223 return true; |
| 224 } |
| 225 } |
| 226 // Unknown target. |
| 227 return false; |
| 228 } |
| 229 |
| 230 /** |
| 231 * Create the [resynthesizer] instance. |
| 232 * |
| 233 * Subclasses must call this method in their constructors. |
| 234 */ |
| 235 void createResynthesizer( |
| 236 InternalAnalysisContext sdkContext, TypeProvider typeProvider) { |
| 237 // Set the type provider to prevent the context from computing it. |
| 238 _context.typeProvider = typeProvider; |
| 239 // Create a chained resynthesizer. |
| 240 _sdkProvider = sdkContext?.resultProvider; |
| 241 _resynthesizer = new _FileBasedSummaryResynthesizer( |
| 242 _sdkProvider?.resynthesizer, |
| 243 _context, |
| 244 typeProvider, |
| 245 _context.sourceFactory, |
| 246 _context.analysisOptions.strongMode, |
| 247 _dataStore); |
| 248 } |
| 249 |
| 250 /** |
| 251 * Return `true` if this result provider can provide a result for the |
| 252 * given [source]. The provider must ensure that [addBundle] is invoked for |
| 253 * every bundle that would be required to provide results for the [source]. |
| 254 */ |
| 255 bool hasResultsForSource(Source source); |
| 256 } |
| 257 |
| 258 /** |
214 * A [SummaryDataStore] is a container for the data extracted from a set of | 259 * A [SummaryDataStore] is a container for the data extracted from a set of |
215 * summary package bundles. It contains maps which can be used to find linked | 260 * summary package bundles. It contains maps which can be used to find linked |
216 * and unlinked summaries by URI. | 261 * and unlinked summaries by URI. |
217 */ | 262 */ |
218 class SummaryDataStore { | 263 class SummaryDataStore { |
219 /** | 264 /** |
220 * List of all [PackageBundle]s. | 265 * List of all [PackageBundle]s. |
221 */ | 266 */ |
222 final List<PackageBundle> bundles = <PackageBundle>[]; | 267 final List<PackageBundle> bundles = <PackageBundle>[]; |
223 | 268 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 * also provides [summaryPath]. | 348 * also provides [summaryPath]. |
304 */ | 349 */ |
305 class _InSummaryFallbackSource extends FileBasedSource | 350 class _InSummaryFallbackSource extends FileBasedSource |
306 implements InSummarySource { | 351 implements InSummarySource { |
307 @override | 352 @override |
308 final String summaryPath; | 353 final String summaryPath; |
309 | 354 |
310 _InSummaryFallbackSource(JavaFile file, Uri uri, this.summaryPath) | 355 _InSummaryFallbackSource(JavaFile file, Uri uri, this.summaryPath) |
311 : super(file, uri); | 356 : super(file, uri); |
312 } | 357 } |
OLD | NEW |