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 1528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1539 List<FunctionElementImpl> buildTopLevelFunctions() { | 1539 List<FunctionElementImpl> buildTopLevelFunctions() { |
1540 return _unitResynthesizer.buildTopLevelFunctions(); | 1540 return _unitResynthesizer.buildTopLevelFunctions(); |
1541 } | 1541 } |
1542 | 1542 |
1543 @override | 1543 @override |
1544 UnitExplicitTopLevelVariables buildTopLevelVariables() { | 1544 UnitExplicitTopLevelVariables buildTopLevelVariables() { |
1545 return _unitResynthesizer.buildUnitExplicitTopLevelVariables(); | 1545 return _unitResynthesizer.buildUnitExplicitTopLevelVariables(); |
1546 } | 1546 } |
1547 | 1547 |
1548 @override | 1548 @override |
| 1549 DartType resolveLinkedType( |
| 1550 int slot, TypeParameterizedElementMixin typeParameterContext) { |
| 1551 return _unitResynthesizer.buildLinkedType(slot, typeParameterContext); |
| 1552 } |
| 1553 |
| 1554 @override |
1549 DartType resolveTypeRef( | 1555 DartType resolveTypeRef( |
1550 EntityRef type, TypeParameterizedElementMixin typeParameterContext, | 1556 EntityRef type, TypeParameterizedElementMixin typeParameterContext, |
1551 {bool defaultVoid: false, bool instantiateToBoundsAllowed: true}) { | 1557 {bool defaultVoid: false, bool instantiateToBoundsAllowed: true}) { |
1552 return _unitResynthesizer.buildType(type, typeParameterContext, | 1558 return _unitResynthesizer.buildType(type, typeParameterContext, |
1553 defaultVoid: defaultVoid, | 1559 defaultVoid: defaultVoid, |
1554 instantiateToBoundsAllowed: instantiateToBoundsAllowed); | 1560 instantiateToBoundsAllowed: instantiateToBoundsAllowed); |
1555 } | 1561 } |
1556 } | 1562 } |
1557 | 1563 |
1558 /** | 1564 /** |
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2101 executableElement.parameters = parameters; | 2107 executableElement.parameters = parameters; |
2102 } | 2108 } |
2103 } | 2109 } |
2104 if (serializedExecutable.kind == UnlinkedExecutableKind.constructor) { | 2110 if (serializedExecutable.kind == UnlinkedExecutableKind.constructor) { |
2105 // Caller handles setting the return type. | 2111 // Caller handles setting the return type. |
2106 assert(serializedExecutable.returnType == null); | 2112 assert(serializedExecutable.returnType == null); |
2107 } else { | 2113 } else { |
2108 bool isSetter = | 2114 bool isSetter = |
2109 serializedExecutable.kind == UnlinkedExecutableKind.setter; | 2115 serializedExecutable.kind == UnlinkedExecutableKind.setter; |
2110 executableElement.returnType = buildLinkedType( | 2116 executableElement.returnType = buildLinkedType( |
2111 serializedExecutable.inferredReturnTypeSlot, | 2117 serializedExecutable.inferredReturnTypeSlot, executableElement) ?? |
2112 _currentTypeParameterizedElement) ?? | 2118 buildType(serializedExecutable.returnType, executableElement, |
2113 buildType( | |
2114 serializedExecutable.returnType, _currentTypeParameterizedElement, | |
2115 defaultVoid: isSetter && summaryResynthesizer.strongMode); | 2119 defaultVoid: isSetter && summaryResynthesizer.strongMode); |
2116 } | 2120 } |
2117 executableElement.type = new FunctionTypeImpl.elementWithNameAndArgs( | 2121 executableElement.type = new FunctionTypeImpl.elementWithNameAndArgs( |
2118 executableElement, null, getCurrentTypeArguments(skipLevels: 1), false); | 2122 executableElement, null, getCurrentTypeArguments(skipLevels: 1), false); |
2119 { | 2123 { |
2120 List<UnlinkedExecutable> unlinkedFunctions = | 2124 List<UnlinkedExecutable> unlinkedFunctions = |
2121 serializedExecutable.localFunctions; | 2125 serializedExecutable.localFunctions; |
2122 int length = unlinkedFunctions.length; | 2126 int length = unlinkedFunctions.length; |
2123 if (length != 0) { | 2127 if (length != 0) { |
2124 List<FunctionElementImpl> localFunctions = | 2128 List<FunctionElementImpl> localFunctions = |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2312 return element; | 2316 return element; |
2313 } | 2317 } |
2314 | 2318 |
2315 /** | 2319 /** |
2316 * Resynthesize a [ParameterElement]. | 2320 * Resynthesize a [ParameterElement]. |
2317 */ | 2321 */ |
2318 ParameterElement buildParameter( | 2322 ParameterElement buildParameter( |
2319 UnlinkedParam serializedParameter, ElementImpl enclosingElement, | 2323 UnlinkedParam serializedParameter, ElementImpl enclosingElement, |
2320 {bool synthetic: false}) { | 2324 {bool synthetic: false}) { |
2321 ParameterElementImpl parameterElement; | 2325 ParameterElementImpl parameterElement; |
2322 bool isLazilyResynthesized = false; | |
2323 int nameOffset = synthetic ? -1 : serializedParameter.nameOffset; | |
2324 if (serializedParameter.isInitializingFormal) { | 2326 if (serializedParameter.isInitializingFormal) { |
2325 FieldFormalParameterElementImpl initializingParameter; | 2327 FieldFormalParameterElementImpl initializingParameter; |
2326 if (serializedParameter.kind == UnlinkedParamKind.required) { | 2328 if (serializedParameter.kind == UnlinkedParamKind.required) { |
2327 initializingParameter = new FieldFormalParameterElementImpl( | 2329 initializingParameter = |
2328 serializedParameter.name, nameOffset); | 2330 new FieldFormalParameterElementImpl.forSerialized( |
| 2331 serializedParameter, enclosingElement); |
2329 } else { | 2332 } else { |
2330 DefaultFieldFormalParameterElementImpl defaultParameter = | 2333 initializingParameter = |
2331 new DefaultFieldFormalParameterElementImpl( | 2334 new DefaultFieldFormalParameterElementImpl.forSerialized( |
2332 serializedParameter.name, nameOffset); | 2335 serializedParameter, enclosingElement); |
2333 initializingParameter = defaultParameter; | |
2334 if (serializedParameter.defaultValue != null) { | |
2335 defaultParameter.constantInitializer = _buildConstExpression( | |
2336 enclosingElement, serializedParameter.defaultValue); | |
2337 defaultParameter.defaultValueCode = | |
2338 serializedParameter.defaultValueCode; | |
2339 } | |
2340 } | 2336 } |
2341 parameterElement = initializingParameter; | 2337 parameterElement = initializingParameter; |
2342 initializingParameter.field = fields[serializedParameter.name]; | |
2343 } else { | 2338 } else { |
2344 if (serializedParameter.kind == UnlinkedParamKind.required) { | 2339 if (serializedParameter.kind == UnlinkedParamKind.required) { |
2345 parameterElement = new ParameterElementImpl.forSerialized( | 2340 parameterElement = new ParameterElementImpl.forSerialized( |
2346 serializedParameter, enclosingElement); | 2341 serializedParameter, enclosingElement); |
2347 isLazilyResynthesized = true; | |
2348 } else { | 2342 } else { |
2349 DefaultParameterElementImpl defaultParameter = | 2343 parameterElement = new DefaultParameterElementImpl.forSerialized( |
2350 new DefaultParameterElementImpl.forSerialized( | 2344 serializedParameter, enclosingElement); |
2351 serializedParameter, enclosingElement); | |
2352 isLazilyResynthesized = true; | |
2353 parameterElement = defaultParameter; | |
2354 } | 2345 } |
2355 } | 2346 } |
2356 parameterElement.synthetic = synthetic; | 2347 parameterElement.synthetic = synthetic; |
2357 if (!isLazilyResynthesized) { | |
2358 buildAnnotations(parameterElement, serializedParameter.annotations); | |
2359 buildCodeRange(parameterElement, serializedParameter.codeRange); | |
2360 } | |
2361 if (serializedParameter.isFunctionTyped) { | 2348 if (serializedParameter.isFunctionTyped) { |
2362 FunctionElementImpl parameterTypeElement = | 2349 FunctionElementImpl parameterTypeElement = |
2363 new FunctionElementImpl('', -1); | 2350 new FunctionElementImpl_forFunctionTypedParameter( |
2364 parameterTypeElement.synthetic = true; | 2351 unit, parameterElement); |
| 2352 if (!synthetic) { |
| 2353 parameterTypeElement.enclosingElement = parameterElement; |
| 2354 } |
2365 List<ParameterElement> subParameters = serializedParameter.parameters | 2355 List<ParameterElement> subParameters = serializedParameter.parameters |
2366 .map((UnlinkedParam p) => | 2356 .map((UnlinkedParam p) => |
2367 buildParameter(p, parameterTypeElement, synthetic: synthetic)) | 2357 buildParameter(p, parameterTypeElement, synthetic: synthetic)) |
2368 .toList(); | 2358 .toList(); |
2369 if (synthetic) { | 2359 if (synthetic) { |
2370 parameterTypeElement.parameters = subParameters; | 2360 parameterTypeElement.parameters = subParameters; |
2371 } else { | 2361 } else { |
2372 parameterElement.parameters = subParameters; | 2362 parameterElement.parameters = subParameters; |
2373 parameterTypeElement.shareParameters(subParameters); | 2363 parameterTypeElement.shareParameters(subParameters); |
2374 parameterTypeElement.enclosingElement = parameterElement; | |
2375 } | 2364 } |
2376 parameterTypeElement.returnType = | 2365 parameterTypeElement.returnType = |
2377 buildType(serializedParameter.type, _currentTypeParameterizedElement); | 2366 buildType(serializedParameter.type, _currentTypeParameterizedElement); |
2378 parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs( | 2367 parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs( |
2379 parameterTypeElement, null, getCurrentTypeArguments(), false); | 2368 parameterTypeElement, null, getCurrentTypeArguments(), false); |
2380 parameterTypeElement.type = parameterElement.type; | 2369 parameterTypeElement.type = parameterElement.type; |
2381 } else { | |
2382 if (serializedParameter.isInitializingFormal && | |
2383 serializedParameter.type == null) { | |
2384 // The type is inherited from the matching field. | |
2385 parameterElement.type = | |
2386 fields[serializedParameter.name]?.type ?? DynamicTypeImpl.instance; | |
2387 } else { | |
2388 parameterElement.type = buildLinkedType( | |
2389 serializedParameter.inferredTypeSlot, | |
2390 _currentTypeParameterizedElement) ?? | |
2391 buildType( | |
2392 serializedParameter.type, _currentTypeParameterizedElement); | |
2393 } | |
2394 if (!isLazilyResynthesized) { | |
2395 parameterElement.hasImplicitType = serializedParameter.type == null; | |
2396 } | |
2397 } | 2370 } |
2398 buildVariableInitializer(parameterElement, serializedParameter.initializer); | 2371 buildVariableInitializer(parameterElement, serializedParameter.initializer); |
2399 switch (serializedParameter.kind) { | 2372 switch (serializedParameter.kind) { |
2400 case UnlinkedParamKind.named: | 2373 case UnlinkedParamKind.named: |
2401 parameterElement.parameterKind = ParameterKind.NAMED; | 2374 parameterElement.parameterKind = ParameterKind.NAMED; |
2402 break; | 2375 break; |
2403 case UnlinkedParamKind.positional: | 2376 case UnlinkedParamKind.positional: |
2404 parameterElement.parameterKind = ParameterKind.POSITIONAL; | 2377 parameterElement.parameterKind = ParameterKind.POSITIONAL; |
2405 break; | 2378 break; |
2406 case UnlinkedParamKind.required: | 2379 case UnlinkedParamKind.required: |
2407 parameterElement.parameterKind = ParameterKind.REQUIRED; | 2380 parameterElement.parameterKind = ParameterKind.REQUIRED; |
2408 break; | 2381 break; |
2409 } | 2382 } |
2410 if (!isLazilyResynthesized) { | |
2411 if (serializedParameter.visibleOffset != 0) { | |
2412 parameterElement.setVisibleRange(serializedParameter.visibleOffset, | |
2413 serializedParameter.visibleLength); | |
2414 } | |
2415 } | |
2416 return parameterElement; | 2383 return parameterElement; |
2417 } | 2384 } |
2418 | 2385 |
2419 /** | 2386 /** |
2420 * Handle the parts that are common to top level variables and fields. | 2387 * Handle the parts that are common to top level variables and fields. |
2421 */ | 2388 */ |
2422 void buildPropertyIntroducingElementCommonParts( | 2389 void buildPropertyIntroducingElementCommonParts( |
2423 PropertyInducingElementImpl element, | 2390 PropertyInducingElementImpl element, |
2424 UnlinkedVariable serializedVariable) { | 2391 UnlinkedVariable serializedVariable) { |
2425 buildVariableCommonParts(element, serializedVariable); | 2392 buildVariableCommonParts(element, serializedVariable); |
(...skipping 28 matching lines...) Expand all Loading... |
2454 if (type == null) { | 2421 if (type == null) { |
2455 if (defaultVoid) { | 2422 if (defaultVoid) { |
2456 return VoidTypeImpl.instance; | 2423 return VoidTypeImpl.instance; |
2457 } else { | 2424 } else { |
2458 return DynamicTypeImpl.instance; | 2425 return DynamicTypeImpl.instance; |
2459 } | 2426 } |
2460 } | 2427 } |
2461 if (type.paramReference != 0) { | 2428 if (type.paramReference != 0) { |
2462 return typeParameterContext.getTypeParameterType(type.paramReference); | 2429 return typeParameterContext.getTypeParameterType(type.paramReference); |
2463 } else if (type.syntheticReturnType != null) { | 2430 } else if (type.syntheticReturnType != null) { |
2464 FunctionElementImpl element = new FunctionElementImpl('', -1); | 2431 FunctionElementImpl element = |
2465 element.synthetic = true; | 2432 new FunctionElementImpl_forLUB(unit, typeParameterContext); |
2466 element.parameters = type.syntheticParams | 2433 element.parameters = type.syntheticParams |
2467 .map((UnlinkedParam param) => | 2434 .map((UnlinkedParam param) => |
2468 buildParameter(param, element, synthetic: true)) | 2435 buildParameter(param, element, synthetic: true)) |
2469 .toList(); | 2436 .toList(); |
2470 element.returnType = | 2437 element.returnType = |
2471 buildType(type.syntheticReturnType, typeParameterContext); | 2438 buildType(type.syntheticReturnType, typeParameterContext); |
2472 FunctionTypeImpl result = new FunctionTypeImpl.elementWithNameAndArgs( | 2439 FunctionTypeImpl result = new FunctionTypeImpl.elementWithNameAndArgs( |
2473 element, null, null, false); | 2440 element, null, null, false); |
2474 element.type = result; | 2441 element.type = result; |
2475 return result; | 2442 return result; |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2667 fields[element.name] = element; | 2634 fields[element.name] = element; |
2668 } | 2635 } |
2669 } | 2636 } |
2670 | 2637 |
2671 /** | 2638 /** |
2672 * Handle the parts that are common to variables. | 2639 * Handle the parts that are common to variables. |
2673 */ | 2640 */ |
2674 void buildVariableCommonParts( | 2641 void buildVariableCommonParts( |
2675 VariableElementImpl element, UnlinkedVariable serializedVariable) { | 2642 VariableElementImpl element, UnlinkedVariable serializedVariable) { |
2676 element.type = buildLinkedType(serializedVariable.inferredTypeSlot, | 2643 element.type = buildLinkedType(serializedVariable.inferredTypeSlot, |
2677 _currentTypeParameterizedElement) ?? | 2644 element.typeParameterContext) ?? |
2678 buildType(serializedVariable.type, _currentTypeParameterizedElement); | 2645 buildType(serializedVariable.type, element.typeParameterContext); |
2679 buildVariableInitializer(element, serializedVariable.initializer); | 2646 buildVariableInitializer(element, serializedVariable.initializer); |
2680 } | 2647 } |
2681 | 2648 |
2682 /** | 2649 /** |
2683 * If the given [serializedInitializer] is not `null`, create the | 2650 * If the given [serializedInitializer] is not `null`, create the |
2684 * corresponding [FunctionElementImpl] and set it for the [variable]. | 2651 * corresponding [FunctionElementImpl] and set it for the [variable]. |
2685 */ | 2652 */ |
2686 void buildVariableInitializer( | 2653 void buildVariableInitializer( |
2687 VariableElementImpl variable, UnlinkedExecutable serializedInitializer) { | 2654 VariableElementImpl variable, UnlinkedExecutable serializedInitializer) { |
2688 if (serializedInitializer == null) { | 2655 if (serializedInitializer == null) { |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2960 static String _getElementIdentifier(String name, ReferenceKind kind) { | 2927 static String _getElementIdentifier(String name, ReferenceKind kind) { |
2961 if (kind == ReferenceKind.topLevelPropertyAccessor || | 2928 if (kind == ReferenceKind.topLevelPropertyAccessor || |
2962 kind == ReferenceKind.propertyAccessor) { | 2929 kind == ReferenceKind.propertyAccessor) { |
2963 if (!name.endsWith('=')) { | 2930 if (!name.endsWith('=')) { |
2964 return name + '?'; | 2931 return name + '?'; |
2965 } | 2932 } |
2966 } | 2933 } |
2967 return name; | 2934 return name; |
2968 } | 2935 } |
2969 } | 2936 } |
OLD | NEW |