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'; |
(...skipping 1527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1538 List<FunctionElementImpl> buildTopLevelFunctions() { | 1538 List<FunctionElementImpl> buildTopLevelFunctions() { |
1539 return _unitResynthesizer.buildTopLevelFunctions(); | 1539 return _unitResynthesizer.buildTopLevelFunctions(); |
1540 } | 1540 } |
1541 | 1541 |
1542 @override | 1542 @override |
1543 UnitExplicitTopLevelVariables buildTopLevelVariables() { | 1543 UnitExplicitTopLevelVariables buildTopLevelVariables() { |
1544 return _unitResynthesizer.buildUnitExplicitTopLevelVariables(); | 1544 return _unitResynthesizer.buildUnitExplicitTopLevelVariables(); |
1545 } | 1545 } |
1546 | 1546 |
1547 @override | 1547 @override |
| 1548 FunctionElementImpl buildVariableInitializer( |
| 1549 VariableElementImpl variable, UnlinkedExecutable serializedInitializer) { |
| 1550 return _unitResynthesizer.buildVariableInitializer( |
| 1551 variable, serializedInitializer); |
| 1552 } |
| 1553 |
| 1554 @override |
1548 DartType resolveLinkedType( | 1555 DartType resolveLinkedType( |
1549 int slot, TypeParameterizedElementMixin typeParameterContext) { | 1556 int slot, TypeParameterizedElementMixin typeParameterContext) { |
1550 return _unitResynthesizer.buildLinkedType(slot, typeParameterContext); | 1557 return _unitResynthesizer.buildLinkedType(slot, typeParameterContext); |
1551 } | 1558 } |
1552 | 1559 |
1553 @override | 1560 @override |
1554 DartType resolveTypeRef( | 1561 DartType resolveTypeRef( |
1555 EntityRef type, TypeParameterizedElementMixin typeParameterContext, | 1562 EntityRef type, TypeParameterizedElementMixin typeParameterContext, |
1556 {bool defaultVoid: false, bool instantiateToBoundsAllowed: true}) { | 1563 {bool defaultVoid: false, bool instantiateToBoundsAllowed: true}) { |
1557 return _unitResynthesizer.buildType(type, typeParameterContext, | 1564 return _unitResynthesizer.buildType(type, typeParameterContext, |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2117 List<UnlinkedLabel> unlinkedLabels = serializedExecutable.localLabels; | 2124 List<UnlinkedLabel> unlinkedLabels = serializedExecutable.localLabels; |
2118 int length = unlinkedLabels.length; | 2125 int length = unlinkedLabels.length; |
2119 if (length != 0) { | 2126 if (length != 0) { |
2120 List<LabelElementImpl> localLabels = new List<LabelElementImpl>(length); | 2127 List<LabelElementImpl> localLabels = new List<LabelElementImpl>(length); |
2121 for (int i = 0; i < length; i++) { | 2128 for (int i = 0; i < length; i++) { |
2122 localLabels[i] = buildLocalLabel(unlinkedLabels[i]); | 2129 localLabels[i] = buildLocalLabel(unlinkedLabels[i]); |
2123 } | 2130 } |
2124 executableElement.labels = localLabels; | 2131 executableElement.labels = localLabels; |
2125 } | 2132 } |
2126 } | 2133 } |
2127 { | |
2128 List<UnlinkedVariable> unlinkedVariables = | |
2129 serializedExecutable.localVariables; | |
2130 int length = unlinkedVariables.length; | |
2131 if (length != 0) { | |
2132 List<LocalVariableElementImpl> localVariables = | |
2133 new List<LocalVariableElementImpl>(length); | |
2134 for (int i = 0; i < length; i++) { | |
2135 localVariables[i] = | |
2136 buildLocalVariable(unlinkedVariables[i], executableElement); | |
2137 } | |
2138 executableElement.localVariables = localVariables; | |
2139 } | |
2140 } | |
2141 currentTypeParameters.removeLast(); | 2134 currentTypeParameters.removeLast(); |
2142 } | 2135 } |
2143 | 2136 |
2144 /** | 2137 /** |
2145 * Build the implicit getter and setter associated with [element], and place | 2138 * Build the implicit getter and setter associated with [element], and place |
2146 * them in [holder]. | 2139 * them in [holder]. |
2147 */ | 2140 */ |
2148 void buildImplicitAccessors( | 2141 void buildImplicitAccessors( |
2149 PropertyInducingElementImpl element, ElementHolder holder) { | 2142 PropertyInducingElementImpl element, ElementHolder holder) { |
2150 PropertyAccessorElementImpl getter = buildImplicitGetter(element); | 2143 PropertyAccessorElementImpl getter = buildImplicitGetter(element); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2239 */ | 2232 */ |
2240 LabelElement buildLocalLabel(UnlinkedLabel serializedLabel) { | 2233 LabelElement buildLocalLabel(UnlinkedLabel serializedLabel) { |
2241 return new LabelElementImpl( | 2234 return new LabelElementImpl( |
2242 serializedLabel.name, | 2235 serializedLabel.name, |
2243 serializedLabel.nameOffset, | 2236 serializedLabel.nameOffset, |
2244 serializedLabel.isOnSwitchStatement, | 2237 serializedLabel.isOnSwitchStatement, |
2245 serializedLabel.isOnSwitchMember); | 2238 serializedLabel.isOnSwitchMember); |
2246 } | 2239 } |
2247 | 2240 |
2248 /** | 2241 /** |
2249 * Resynthesize a [LocalVariableElement]. | |
2250 */ | |
2251 LocalVariableElement buildLocalVariable(UnlinkedVariable serializedVariable, | |
2252 ExecutableElementImpl enclosingExecutable) { | |
2253 LocalVariableElementImpl element; | |
2254 if (serializedVariable.initializer?.bodyExpr != null && | |
2255 serializedVariable.isConst) { | |
2256 ConstLocalVariableElementImpl constElement = | |
2257 new ConstLocalVariableElementImpl.forSerialized( | |
2258 serializedVariable, enclosingExecutable); | |
2259 element = constElement; | |
2260 constElement.constantInitializer = _buildConstExpression( | |
2261 enclosingExecutable, serializedVariable.initializer.bodyExpr); | |
2262 } else { | |
2263 element = new LocalVariableElementImpl.forSerialized( | |
2264 serializedVariable, enclosingExecutable); | |
2265 } | |
2266 if (serializedVariable.visibleOffset != 0) { | |
2267 element.setVisibleRange( | |
2268 serializedVariable.visibleOffset, serializedVariable.visibleLength); | |
2269 } | |
2270 buildVariableCommonParts(element, serializedVariable); | |
2271 return element; | |
2272 } | |
2273 | |
2274 /** | |
2275 * Resynthesize a [ParameterElement]. | 2242 * Resynthesize a [ParameterElement]. |
2276 */ | 2243 */ |
2277 ParameterElement buildParameter( | 2244 ParameterElement buildParameter( |
2278 UnlinkedParam serializedParameter, ElementImpl enclosingElement, | 2245 UnlinkedParam serializedParameter, ElementImpl enclosingElement, |
2279 {bool synthetic: false}) { | 2246 {bool synthetic: false}) { |
2280 ParameterElementImpl parameterElement; | 2247 ParameterElementImpl parameterElement; |
2281 if (serializedParameter.isInitializingFormal) { | 2248 if (serializedParameter.isInitializingFormal) { |
2282 if (serializedParameter.kind == UnlinkedParamKind.required) { | 2249 if (serializedParameter.kind == UnlinkedParamKind.required) { |
2283 parameterElement = new FieldFormalParameterElementImpl.forSerialized( | 2250 parameterElement = new FieldFormalParameterElementImpl.forSerialized( |
2284 serializedParameter, enclosingElement); | 2251 serializedParameter, enclosingElement); |
(...skipping 28 matching lines...) Expand all Loading... |
2313 } else { | 2280 } else { |
2314 parameterElement.parameters = subParameters; | 2281 parameterElement.parameters = subParameters; |
2315 parameterTypeElement.shareParameters(subParameters); | 2282 parameterTypeElement.shareParameters(subParameters); |
2316 } | 2283 } |
2317 parameterTypeElement.returnType = | 2284 parameterTypeElement.returnType = |
2318 buildType(serializedParameter.type, _currentTypeParameterizedElement); | 2285 buildType(serializedParameter.type, _currentTypeParameterizedElement); |
2319 parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs( | 2286 parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs( |
2320 parameterTypeElement, null, getCurrentTypeArguments(), false); | 2287 parameterTypeElement, null, getCurrentTypeArguments(), false); |
2321 parameterTypeElement.type = parameterElement.type; | 2288 parameterTypeElement.type = parameterElement.type; |
2322 } | 2289 } |
2323 buildVariableInitializer(parameterElement, serializedParameter.initializer); | |
2324 return parameterElement; | 2290 return parameterElement; |
2325 } | 2291 } |
2326 | 2292 |
2327 List<FunctionElementImpl> buildTopLevelFunctions() { | 2293 List<FunctionElementImpl> buildTopLevelFunctions() { |
2328 List<FunctionElementImpl> functions = <FunctionElementImpl>[]; | 2294 List<FunctionElementImpl> functions = <FunctionElementImpl>[]; |
2329 List<UnlinkedExecutable> executables = unlinkedUnit.executables; | 2295 List<UnlinkedExecutable> executables = unlinkedUnit.executables; |
2330 for (UnlinkedExecutable unlinkedExecutable in executables) { | 2296 for (UnlinkedExecutable unlinkedExecutable in executables) { |
2331 if (unlinkedExecutable.kind == UnlinkedExecutableKind.functionOrMethod) { | 2297 if (unlinkedExecutable.kind == UnlinkedExecutableKind.functionOrMethod) { |
2332 FunctionElementImpl function = | 2298 FunctionElementImpl function = |
2333 new FunctionElementImpl.forSerialized(unlinkedExecutable, unit); | 2299 new FunctionElementImpl.forSerialized(unlinkedExecutable, unit); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2508 ConstTopLevelVariableElementImpl constElement = | 2474 ConstTopLevelVariableElementImpl constElement = |
2509 new ConstTopLevelVariableElementImpl.forSerialized( | 2475 new ConstTopLevelVariableElementImpl.forSerialized( |
2510 unlinkedVariable, unit); | 2476 unlinkedVariable, unit); |
2511 element = constElement; | 2477 element = constElement; |
2512 constElement.constantInitializer = | 2478 constElement.constantInitializer = |
2513 _buildConstExpression(null, unlinkedVariable.initializer.bodyExpr); | 2479 _buildConstExpression(null, unlinkedVariable.initializer.bodyExpr); |
2514 } else { | 2480 } else { |
2515 element = new TopLevelVariableElementImpl.forSerialized( | 2481 element = new TopLevelVariableElementImpl.forSerialized( |
2516 unlinkedVariable, unit); | 2482 unlinkedVariable, unit); |
2517 } | 2483 } |
2518 buildVariableCommonParts(element, unlinkedVariable); | |
2519 variablesData.variables[i] = element; | 2484 variablesData.variables[i] = element; |
2520 // implicit accessors | 2485 // implicit accessors |
2521 variablesData.implicitAccessors.add(buildImplicitGetter(element)); | 2486 variablesData.implicitAccessors.add(buildImplicitGetter(element)); |
2522 if (!(element.isConst || element.isFinal)) { | 2487 if (!(element.isConst || element.isFinal)) { |
2523 variablesData.implicitAccessors.add(buildImplicitSetter(element)); | 2488 variablesData.implicitAccessors.add(buildImplicitSetter(element)); |
2524 } | 2489 } |
2525 } | 2490 } |
2526 return variablesData; | 2491 return variablesData; |
2527 } | 2492 } |
2528 | 2493 |
2529 /** | 2494 /** |
2530 * Resynthesize a [TopLevelVariableElement] or [FieldElement]. | 2495 * Resynthesize a [TopLevelVariableElement] or [FieldElement]. |
2531 */ | 2496 */ |
2532 void buildVariable( | 2497 void buildVariable( |
2533 ClassElementImpl enclosingClass, UnlinkedVariable serializedVariable, | 2498 ClassElementImpl enclosingClass, UnlinkedVariable serializedVariable, |
2534 [ElementHolder holder]) { | 2499 [ElementHolder holder]) { |
2535 if (holder == null) { | 2500 if (holder == null) { |
2536 throw new UnimplementedError('Must be lazy'); | 2501 throw new UnimplementedError('Must be lazy'); |
2537 } else { | 2502 } else { |
2538 FieldElementImpl element; | 2503 FieldElementImpl element; |
2539 if (serializedVariable.initializer?.bodyExpr != null && | 2504 if (serializedVariable.initializer?.bodyExpr != null && |
2540 (serializedVariable.isConst || | 2505 (serializedVariable.isConst || |
2541 serializedVariable.isFinal && !serializedVariable.isStatic)) { | 2506 serializedVariable.isFinal && !serializedVariable.isStatic)) { |
2542 element = new ConstFieldElementImpl.forSerialized( | 2507 element = new ConstFieldElementImpl.forSerialized( |
2543 serializedVariable, enclosingClass); | 2508 serializedVariable, enclosingClass); |
2544 } else { | 2509 } else { |
2545 element = new FieldElementImpl.forSerialized( | 2510 element = new FieldElementImpl.forSerialized( |
2546 serializedVariable, enclosingClass); | 2511 serializedVariable, enclosingClass); |
2547 } | 2512 } |
2548 buildVariableCommonParts(element, serializedVariable); | |
2549 element.static = serializedVariable.isStatic; | 2513 element.static = serializedVariable.isStatic; |
2550 holder.addField(element); | 2514 holder.addField(element); |
2551 buildImplicitAccessors(element, holder); | 2515 buildImplicitAccessors(element, holder); |
2552 fields[element.name] = element; | 2516 fields[element.name] = element; |
2553 } | 2517 } |
2554 } | 2518 } |
2555 | 2519 |
2556 /** | 2520 /** |
2557 * Handle the parts that are common to variables. | 2521 * If the given [serializedInitializer] is not `null`, return the |
| 2522 * corresponding [FunctionElementImpl], otherwise return `null`. |
2558 */ | 2523 */ |
2559 void buildVariableCommonParts( | 2524 FunctionElementImpl buildVariableInitializer( |
2560 VariableElementImpl element, UnlinkedVariable serializedVariable) { | |
2561 buildVariableInitializer(element, serializedVariable.initializer); | |
2562 } | |
2563 | |
2564 /** | |
2565 * If the given [serializedInitializer] is not `null`, create the | |
2566 * corresponding [FunctionElementImpl] and set it for the [variable]. | |
2567 */ | |
2568 void buildVariableInitializer( | |
2569 VariableElementImpl variable, UnlinkedExecutable serializedInitializer) { | 2525 VariableElementImpl variable, UnlinkedExecutable serializedInitializer) { |
2570 if (serializedInitializer == null) { | 2526 if (serializedInitializer == null) { |
2571 return null; | 2527 return null; |
2572 } | 2528 } |
2573 FunctionElementImpl initializerElement = | 2529 FunctionElementImpl initializerElement = |
2574 buildLocalFunction(serializedInitializer, variable); | 2530 buildLocalFunction(serializedInitializer, variable); |
2575 initializerElement.synthetic = true; | 2531 initializerElement.synthetic = true; |
2576 variable.initializer = initializerElement; | 2532 return initializerElement; |
2577 } | 2533 } |
2578 | 2534 |
2579 /** | 2535 /** |
2580 * Finish creating a [TypeParameterElement] by deserializing its bound. | 2536 * Finish creating a [TypeParameterElement] by deserializing its bound. |
2581 */ | 2537 */ |
2582 void finishTypeParameter(UnlinkedTypeParam serializedTypeParameter, | 2538 void finishTypeParameter(UnlinkedTypeParam serializedTypeParameter, |
2583 TypeParameterElementImpl typeParameterElement) { | 2539 TypeParameterElementImpl typeParameterElement) { |
2584 if (serializedTypeParameter.bound != null) { | 2540 if (serializedTypeParameter.bound != null) { |
2585 typeParameterElement.bound = buildType( | 2541 typeParameterElement.bound = buildType( |
2586 serializedTypeParameter.bound, _currentTypeParameterizedElement, | 2542 serializedTypeParameter.bound, _currentTypeParameterizedElement, |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2842 static String _getElementIdentifier(String name, ReferenceKind kind) { | 2798 static String _getElementIdentifier(String name, ReferenceKind kind) { |
2843 if (kind == ReferenceKind.topLevelPropertyAccessor || | 2799 if (kind == ReferenceKind.topLevelPropertyAccessor || |
2844 kind == ReferenceKind.propertyAccessor) { | 2800 kind == ReferenceKind.propertyAccessor) { |
2845 if (!name.endsWith('=')) { | 2801 if (!name.endsWith('=')) { |
2846 return name + '?'; | 2802 return name + '?'; |
2847 } | 2803 } |
2848 } | 2804 } |
2849 return name; | 2805 return name; |
2850 } | 2806 } |
2851 } | 2807 } |
OLD | NEW |