| 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 // 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 summary_resynthesizer; | 5 library summary_resynthesizer; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
| 11 import 'package:analyzer/dart/element/element.dart'; | 11 import 'package:analyzer/dart/element/element.dart'; |
| 12 import 'package:analyzer/dart/element/type.dart'; | 12 import 'package:analyzer/dart/element/type.dart'; |
| 13 import 'package:analyzer/src/dart/element/element.dart'; | 13 import 'package:analyzer/src/dart/element/element.dart'; |
| 14 import 'package:analyzer/src/dart/element/handle.dart'; | 14 import 'package:analyzer/src/dart/element/handle.dart'; |
| 15 import 'package:analyzer/src/dart/element/member.dart'; | 15 import 'package:analyzer/src/dart/element/member.dart'; |
| 16 import 'package:analyzer/src/dart/element/type.dart'; | 16 import 'package:analyzer/src/dart/element/type.dart'; |
| 17 import 'package:analyzer/src/generated/engine.dart'; | 17 import 'package:analyzer/src/generated/engine.dart'; |
| 18 import 'package:analyzer/src/generated/resolver.dart'; | 18 import 'package:analyzer/src/generated/resolver.dart'; |
| 19 import 'package:analyzer/src/generated/source_io.dart'; | 19 import 'package:analyzer/src/generated/source_io.dart'; |
| 20 import 'package:analyzer/src/generated/testing/ast_factory.dart'; | 20 import 'package:analyzer/src/generated/testing/ast_factory.dart'; |
| 21 import 'package:analyzer/src/generated/testing/token_factory.dart'; | 21 import 'package:analyzer/src/generated/testing/token_factory.dart'; |
| 22 import 'package:analyzer/src/summary/format.dart'; |
| 22 import 'package:analyzer/src/summary/idl.dart'; | 23 import 'package:analyzer/src/summary/idl.dart'; |
| 23 | 24 |
| 24 /** | 25 /** |
| 25 * Implementation of [ElementResynthesizer] used when resynthesizing an element | 26 * Implementation of [ElementResynthesizer] used when resynthesizing an element |
| 26 * model from summaries. | 27 * model from summaries. |
| 27 */ | 28 */ |
| 28 abstract class SummaryResynthesizer extends ElementResynthesizer { | 29 abstract class SummaryResynthesizer extends ElementResynthesizer { |
| 29 /** | 30 /** |
| 30 * The parent [SummaryResynthesizer] which is asked to resynthesize elements | 31 * The parent [SummaryResynthesizer] which is asked to resynthesize elements |
| 31 * and get summaries before this resynthesizer attempts to do this. | 32 * and get summaries before this resynthesizer attempts to do this. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 } | 145 } |
| 145 CompilationUnitElementImpl unitElement = libraryMap[unitUri]; | 146 CompilationUnitElementImpl unitElement = libraryMap[unitUri]; |
| 146 // Fill elements in the unit map. | 147 // Fill elements in the unit map. |
| 147 if (unitElement != null) { | 148 if (unitElement != null) { |
| 148 elementsInUnit = new HashMap<String, Element>(); | 149 elementsInUnit = new HashMap<String, Element>(); |
| 149 void putElement(Element e) { | 150 void putElement(Element e) { |
| 150 String id = | 151 String id = |
| 151 e is PropertyAccessorElementImpl ? e.identifier : e.name; | 152 e is PropertyAccessorElementImpl ? e.identifier : e.name; |
| 152 elementsInUnit[id] = e; | 153 elementsInUnit[id] = e; |
| 153 } | 154 } |
| 155 |
| 154 unitElement.accessors.forEach(putElement); | 156 unitElement.accessors.forEach(putElement); |
| 155 unitElement.enums.forEach(putElement); | 157 unitElement.enums.forEach(putElement); |
| 156 unitElement.functions.forEach(putElement); | 158 unitElement.functions.forEach(putElement); |
| 157 unitElement.functionTypeAliases.forEach(putElement); | 159 unitElement.functionTypeAliases.forEach(putElement); |
| 158 unitElement.topLevelVariables.forEach(putElement); | 160 unitElement.topLevelVariables.forEach(putElement); |
| 159 unitElement.types.forEach(putElement); | 161 unitElement.types.forEach(putElement); |
| 160 unitsInLibrary[unitUri] = elementsInUnit; | 162 unitsInLibrary[unitUri] = elementsInUnit; |
| 161 } | 163 } |
| 162 } | 164 } |
| 163 // Get the element. | 165 // Get the element. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 | 199 |
| 198 /** | 200 /** |
| 199 * Get the [LibraryElement] for the given [uri], resynthesizing it if it | 201 * Get the [LibraryElement] for the given [uri], resynthesizing it if it |
| 200 * hasn't been resynthesized already. | 202 * hasn't been resynthesized already. |
| 201 */ | 203 */ |
| 202 LibraryElement getLibraryElement(String uri) { | 204 LibraryElement getLibraryElement(String uri) { |
| 203 if (parent != null && parent._hasLibrarySummary(uri)) { | 205 if (parent != null && parent._hasLibrarySummary(uri)) { |
| 204 return parent.getLibraryElement(uri); | 206 return parent.getLibraryElement(uri); |
| 205 } | 207 } |
| 206 return _resynthesizedLibraries.putIfAbsent(uri, () { | 208 return _resynthesizedLibraries.putIfAbsent(uri, () { |
| 207 LinkedLibrary serializedLibrary = _getLinkedSummaryOrThrow(uri); | 209 LinkedLibrary serializedLibrary = _getLinkedSummaryOrNull(uri); |
| 208 List<UnlinkedUnit> serializedUnits = <UnlinkedUnit>[ | |
| 209 _getUnlinkedSummaryOrThrow(uri) | |
| 210 ]; | |
| 211 Source librarySource = _getSource(uri); | 210 Source librarySource = _getSource(uri); |
| 211 if (serializedLibrary == null) { |
| 212 LibraryElementImpl libraryElement = |
| 213 new LibraryElementImpl(context, '', -1, 0); |
| 214 libraryElement.synthetic = true; |
| 215 CompilationUnitElementImpl unitElement = |
| 216 new CompilationUnitElementImpl(librarySource.shortName); |
| 217 libraryElement.definingCompilationUnit = unitElement; |
| 218 unitElement.source = librarySource; |
| 219 unitElement.librarySource = librarySource; |
| 220 return libraryElement..synthetic = true; |
| 221 } |
| 222 UnlinkedUnit unlinkedSummary = _getUnlinkedSummaryOrNull(uri); |
| 223 if (unlinkedSummary == null) { |
| 224 throw new StateError('Unable to find unlinked summary: $uri'); |
| 225 } |
| 226 List<UnlinkedUnit> serializedUnits = <UnlinkedUnit>[unlinkedSummary]; |
| 212 for (String part in serializedUnits[0].publicNamespace.parts) { | 227 for (String part in serializedUnits[0].publicNamespace.parts) { |
| 213 Source partSource = sourceFactory.resolveUri(librarySource, part); | 228 Source partSource = sourceFactory.resolveUri(librarySource, part); |
| 214 String partAbsUri = partSource.uri.toString(); | 229 String partAbsUri = partSource.uri.toString(); |
| 215 serializedUnits.add(_getUnlinkedSummaryOrThrow(partAbsUri)); | 230 serializedUnits.add(_getUnlinkedSummaryOrNull(partAbsUri) ?? |
| 231 new UnlinkedUnitBuilder(codeRange: new CodeRangeBuilder())); |
| 216 } | 232 } |
| 217 _LibraryResynthesizer libraryResynthesizer = new _LibraryResynthesizer( | 233 _LibraryResynthesizer libraryResynthesizer = new _LibraryResynthesizer( |
| 218 this, serializedLibrary, serializedUnits, librarySource); | 234 this, serializedLibrary, serializedUnits, librarySource); |
| 219 LibraryElement library = libraryResynthesizer.buildLibrary(); | 235 LibraryElement library = libraryResynthesizer.buildLibrary(); |
| 220 _resynthesizedUnits[uri] = libraryResynthesizer.resynthesizedUnits; | 236 _resynthesizedUnits[uri] = libraryResynthesizer.resynthesizedUnits; |
| 221 return library; | 237 return library; |
| 222 }); | 238 }); |
| 223 } | 239 } |
| 224 | 240 |
| 225 /** | 241 /** |
| (...skipping 11 matching lines...) Expand all Loading... |
| 237 UnlinkedUnit getUnlinkedSummary(String uri); | 253 UnlinkedUnit getUnlinkedSummary(String uri); |
| 238 | 254 |
| 239 /** | 255 /** |
| 240 * Return `true` if this resynthesizer can provide summaries of the libraries | 256 * Return `true` if this resynthesizer can provide summaries of the libraries |
| 241 * with the given [uri]. Caller has already checked that | 257 * with the given [uri]. Caller has already checked that |
| 242 * `parent.hasLibrarySummary(uri)` returns `false`. | 258 * `parent.hasLibrarySummary(uri)` returns `false`. |
| 243 */ | 259 */ |
| 244 bool hasLibrarySummary(String uri); | 260 bool hasLibrarySummary(String uri); |
| 245 | 261 |
| 246 /** | 262 /** |
| 247 * Return the [LinkedLibrary] for the given [uri] or throw [StateError] if it | 263 * Return the [LinkedLibrary] for the given [uri] or return `null` if it |
| 248 * could not be found. | 264 * could not be found. |
| 249 */ | 265 */ |
| 250 LinkedLibrary _getLinkedSummaryOrThrow(String uri) { | 266 LinkedLibrary _getLinkedSummaryOrNull(String uri) { |
| 251 if (parent != null && parent._hasLibrarySummary(uri)) { | 267 if (parent != null && parent._hasLibrarySummary(uri)) { |
| 252 return parent._getLinkedSummaryOrThrow(uri); | 268 return parent._getLinkedSummaryOrNull(uri); |
| 253 } | 269 } |
| 254 LinkedLibrary summary = getLinkedSummary(uri); | 270 return getLinkedSummary(uri); |
| 255 if (summary != null) { | |
| 256 return summary; | |
| 257 } | |
| 258 throw new StateError('Unable to find linked summary: $uri'); | |
| 259 } | 271 } |
| 260 | 272 |
| 261 /** | 273 /** |
| 262 * Get the [Source] object for the given [uri]. | 274 * Get the [Source] object for the given [uri]. |
| 263 */ | 275 */ |
| 264 Source _getSource(String uri) { | 276 Source _getSource(String uri) { |
| 265 return _sources.putIfAbsent(uri, () => sourceFactory.forUri(uri)); | 277 return _sources.putIfAbsent(uri, () => sourceFactory.forUri(uri)); |
| 266 } | 278 } |
| 267 | 279 |
| 268 /** | 280 /** |
| 269 * Return the [UnlinkedUnit] for the given [uri] or throw [StateError] if it | 281 * Return the [UnlinkedUnit] for the given [uri] or return `null` if it |
| 270 * could not be found. | 282 * could not be found. |
| 271 */ | 283 */ |
| 272 UnlinkedUnit _getUnlinkedSummaryOrThrow(String uri) { | 284 UnlinkedUnit _getUnlinkedSummaryOrNull(String uri) { |
| 273 if (parent != null && parent._hasLibrarySummary(uri)) { | 285 if (parent != null && parent._hasLibrarySummary(uri)) { |
| 274 return parent._getUnlinkedSummaryOrThrow(uri); | 286 return parent._getUnlinkedSummaryOrNull(uri); |
| 275 } | 287 } |
| 276 UnlinkedUnit summary = getUnlinkedSummary(uri); | 288 return getUnlinkedSummary(uri); |
| 277 if (summary != null) { | |
| 278 return summary; | |
| 279 } | |
| 280 throw new StateError('Unable to find unlinked summary: $uri'); | |
| 281 } | 289 } |
| 282 | 290 |
| 283 /** | 291 /** |
| 284 * Return `true` if this resynthesizer can provide summaries of the libraries | 292 * Return `true` if this resynthesizer can provide summaries of the libraries |
| 285 * with the given [uri]. | 293 * with the given [uri]. |
| 286 */ | 294 */ |
| 287 bool _hasLibrarySummary(String uri) { | 295 bool _hasLibrarySummary(String uri) { |
| 288 if (parent != null && parent._hasLibrarySummary(uri)) { | 296 if (parent != null && parent._hasLibrarySummary(uri)) { |
| 289 return true; | 297 return true; |
| 290 } | 298 } |
| (...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 for (int i = 0; i < numTypeParameters; i++) { | 1281 for (int i = 0; i < numTypeParameters; i++) { |
| 1274 typeArguments[i] = getTypeArgument(i); | 1282 typeArguments[i] = getTypeArgument(i); |
| 1275 } | 1283 } |
| 1276 } | 1284 } |
| 1277 InterfaceTypeImpl type = | 1285 InterfaceTypeImpl type = |
| 1278 new InterfaceTypeImpl.elementWithNameAndArgs(element, name, () { | 1286 new InterfaceTypeImpl.elementWithNameAndArgs(element, name, () { |
| 1279 if (typeArguments == null) { | 1287 if (typeArguments == null) { |
| 1280 typeArguments = element.typeParameters.map((typeParameter) { | 1288 typeArguments = element.typeParameters.map((typeParameter) { |
| 1281 DartType bound = typeParameter.bound; | 1289 DartType bound = typeParameter.bound; |
| 1282 return libraryResynthesizer.summaryResynthesizer.strongMode && | 1290 return libraryResynthesizer.summaryResynthesizer.strongMode && |
| 1283 instantiateToBoundsAllowed && | 1291 instantiateToBoundsAllowed && |
| 1284 bound != null ? bound : DynamicTypeImpl.instance; | 1292 bound != null |
| 1293 ? bound |
| 1294 : DynamicTypeImpl.instance; |
| 1285 }).toList(); | 1295 }).toList(); |
| 1286 } | 1296 } |
| 1287 return typeArguments; | 1297 return typeArguments; |
| 1288 }); | 1298 }); |
| 1289 // Mark the type as having implicit type arguments, so that we don't | 1299 // Mark the type as having implicit type arguments, so that we don't |
| 1290 // attempt to request them during constant expression resynthesizing. | 1300 // attempt to request them during constant expression resynthesizing. |
| 1291 if (typeArguments == null) { | 1301 if (typeArguments == null) { |
| 1292 libraryResynthesizer.typesWithImplicitTypeArguments.add(type); | 1302 libraryResynthesizer.typesWithImplicitTypeArguments.add(type); |
| 1293 } | 1303 } |
| 1294 // Done. | 1304 // Done. |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1566 new FunctionElementImpl_forLUB(unit, typeParameterContext, type); | 1576 new FunctionElementImpl_forLUB(unit, typeParameterContext, type); |
| 1567 return element.type; | 1577 return element.type; |
| 1568 } else { | 1578 } else { |
| 1569 DartType getTypeArgument(int i) { | 1579 DartType getTypeArgument(int i) { |
| 1570 if (i < type.typeArguments.length) { | 1580 if (i < type.typeArguments.length) { |
| 1571 return buildType(type.typeArguments[i], typeParameterContext); | 1581 return buildType(type.typeArguments[i], typeParameterContext); |
| 1572 } else { | 1582 } else { |
| 1573 return DynamicTypeImpl.instance; | 1583 return DynamicTypeImpl.instance; |
| 1574 } | 1584 } |
| 1575 } | 1585 } |
| 1586 |
| 1576 _ReferenceInfo referenceInfo = getReferenceInfo(type.reference); | 1587 _ReferenceInfo referenceInfo = getReferenceInfo(type.reference); |
| 1577 return referenceInfo.buildType( | 1588 return referenceInfo.buildType( |
| 1578 instantiateToBoundsAllowed, | 1589 instantiateToBoundsAllowed, |
| 1579 type.typeArguments.length, | 1590 type.typeArguments.length, |
| 1580 getTypeArgument, | 1591 getTypeArgument, |
| 1581 type.implicitFunctionTypeIndices); | 1592 type.implicitFunctionTypeIndices); |
| 1582 } | 1593 } |
| 1583 } | 1594 } |
| 1584 | 1595 |
| 1585 UnitExplicitTopLevelAccessors buildUnitExplicitTopLevelAccessors() { | 1596 UnitExplicitTopLevelAccessors buildUnitExplicitTopLevelAccessors() { |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1837 static String _getElementIdentifier(String name, ReferenceKind kind) { | 1848 static String _getElementIdentifier(String name, ReferenceKind kind) { |
| 1838 if (kind == ReferenceKind.topLevelPropertyAccessor || | 1849 if (kind == ReferenceKind.topLevelPropertyAccessor || |
| 1839 kind == ReferenceKind.propertyAccessor) { | 1850 kind == ReferenceKind.propertyAccessor) { |
| 1840 if (!name.endsWith('=')) { | 1851 if (!name.endsWith('=')) { |
| 1841 return name + '?'; | 1852 return name + '?'; |
| 1842 } | 1853 } |
| 1843 } | 1854 } |
| 1844 return name; | 1855 return name; |
| 1845 } | 1856 } |
| 1846 } | 1857 } |
| OLD | NEW |