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 2082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2093 UnlinkedExecutable serializedExecutable) { | 2093 UnlinkedExecutable serializedExecutable) { |
2094 executableElement.typeParameters = | 2094 executableElement.typeParameters = |
2095 buildTypeParameters(serializedExecutable.typeParameters); | 2095 buildTypeParameters(serializedExecutable.typeParameters); |
2096 { | 2096 { |
2097 List<UnlinkedParam> unlinkedParameters = serializedExecutable.parameters; | 2097 List<UnlinkedParam> unlinkedParameters = serializedExecutable.parameters; |
2098 int length = unlinkedParameters.length; | 2098 int length = unlinkedParameters.length; |
2099 if (length != 0) { | 2099 if (length != 0) { |
2100 List<ParameterElementImpl> parameters = | 2100 List<ParameterElementImpl> parameters = |
2101 new List<ParameterElementImpl>(length); | 2101 new List<ParameterElementImpl>(length); |
2102 for (int i = 0; i < length; i++) { | 2102 for (int i = 0; i < length; i++) { |
2103 parameters[i] = | 2103 parameters[i] = new ParameterElementImpl.forSerializedFactory( |
2104 buildParameter(unlinkedParameters[i], executableElement); | 2104 unlinkedParameters[i], executableElement); |
2105 } | 2105 } |
2106 executableElement.parameters = parameters; | 2106 executableElement.parameters = parameters; |
2107 } | 2107 } |
2108 } | 2108 } |
2109 { | 2109 { |
2110 List<UnlinkedExecutable> unlinkedFunctions = | 2110 List<UnlinkedExecutable> unlinkedFunctions = |
2111 serializedExecutable.localFunctions; | 2111 serializedExecutable.localFunctions; |
2112 int length = unlinkedFunctions.length; | 2112 int length = unlinkedFunctions.length; |
2113 if (length != 0) { | 2113 if (length != 0) { |
2114 List<FunctionElementImpl> localFunctions = | 2114 List<FunctionElementImpl> localFunctions = |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2231 * Resynthesize a [LabelElement]. | 2231 * Resynthesize a [LabelElement]. |
2232 */ | 2232 */ |
2233 LabelElement buildLocalLabel(UnlinkedLabel serializedLabel) { | 2233 LabelElement buildLocalLabel(UnlinkedLabel serializedLabel) { |
2234 return new LabelElementImpl( | 2234 return new LabelElementImpl( |
2235 serializedLabel.name, | 2235 serializedLabel.name, |
2236 serializedLabel.nameOffset, | 2236 serializedLabel.nameOffset, |
2237 serializedLabel.isOnSwitchStatement, | 2237 serializedLabel.isOnSwitchStatement, |
2238 serializedLabel.isOnSwitchMember); | 2238 serializedLabel.isOnSwitchMember); |
2239 } | 2239 } |
2240 | 2240 |
2241 /** | |
2242 * Resynthesize a [ParameterElement]. | |
2243 */ | |
2244 ParameterElement buildParameter( | |
2245 UnlinkedParam serializedParameter, ElementImpl enclosingElement, | |
2246 {bool synthetic: false}) { | |
2247 ParameterElementImpl parameterElement; | |
2248 if (serializedParameter.isInitializingFormal) { | |
2249 if (serializedParameter.kind == UnlinkedParamKind.required) { | |
2250 parameterElement = new FieldFormalParameterElementImpl.forSerialized( | |
2251 serializedParameter, enclosingElement); | |
2252 } else { | |
2253 parameterElement = | |
2254 new DefaultFieldFormalParameterElementImpl.forSerialized( | |
2255 serializedParameter, enclosingElement); | |
2256 } | |
2257 } else { | |
2258 if (serializedParameter.kind == UnlinkedParamKind.required) { | |
2259 parameterElement = new ParameterElementImpl.forSerialized( | |
2260 serializedParameter, enclosingElement); | |
2261 } else { | |
2262 parameterElement = new DefaultParameterElementImpl.forSerialized( | |
2263 serializedParameter, enclosingElement); | |
2264 } | |
2265 } | |
2266 parameterElement.synthetic = synthetic; | |
2267 if (serializedParameter.isFunctionTyped) { | |
2268 FunctionElementImpl parameterTypeElement = | |
2269 new FunctionElementImpl_forFunctionTypedParameter( | |
2270 unit, parameterElement); | |
2271 if (!synthetic) { | |
2272 parameterTypeElement.enclosingElement = parameterElement; | |
2273 } | |
2274 List<ParameterElement> subParameters = serializedParameter.parameters | |
2275 .map((UnlinkedParam p) => | |
2276 buildParameter(p, parameterTypeElement, synthetic: synthetic)) | |
2277 .toList(); | |
2278 if (synthetic) { | |
2279 parameterTypeElement.parameters = subParameters; | |
2280 } else { | |
2281 parameterElement.parameters = subParameters; | |
2282 parameterTypeElement.shareParameters(subParameters); | |
2283 } | |
2284 parameterTypeElement.returnType = | |
2285 buildType(serializedParameter.type, _currentTypeParameterizedElement); | |
2286 parameterElement.type = new FunctionTypeImpl.elementWithNameAndArgs( | |
2287 parameterTypeElement, null, getCurrentTypeArguments(), false); | |
2288 parameterTypeElement.type = parameterElement.type; | |
2289 } | |
2290 return parameterElement; | |
2291 } | |
2292 | |
2293 List<FunctionElementImpl> buildTopLevelFunctions() { | 2241 List<FunctionElementImpl> buildTopLevelFunctions() { |
2294 List<FunctionElementImpl> functions = <FunctionElementImpl>[]; | 2242 List<FunctionElementImpl> functions = <FunctionElementImpl>[]; |
2295 List<UnlinkedExecutable> executables = unlinkedUnit.executables; | 2243 List<UnlinkedExecutable> executables = unlinkedUnit.executables; |
2296 for (UnlinkedExecutable unlinkedExecutable in executables) { | 2244 for (UnlinkedExecutable unlinkedExecutable in executables) { |
2297 if (unlinkedExecutable.kind == UnlinkedExecutableKind.functionOrMethod) { | 2245 if (unlinkedExecutable.kind == UnlinkedExecutableKind.functionOrMethod) { |
2298 FunctionElementImpl function = | 2246 FunctionElementImpl function = |
2299 new FunctionElementImpl.forSerialized(unlinkedExecutable, unit); | 2247 new FunctionElementImpl.forSerialized(unlinkedExecutable, unit); |
2300 buildExecutableCommonParts(function, unlinkedExecutable); | 2248 buildExecutableCommonParts(function, unlinkedExecutable); |
2301 functions.add(function); | 2249 functions.add(function); |
2302 } | 2250 } |
(...skipping 17 matching lines...) Expand all Loading... |
2320 return DynamicTypeImpl.instance; | 2268 return DynamicTypeImpl.instance; |
2321 } | 2269 } |
2322 } | 2270 } |
2323 if (type.paramReference != 0) { | 2271 if (type.paramReference != 0) { |
2324 return typeParameterContext.getTypeParameterType(type.paramReference); | 2272 return typeParameterContext.getTypeParameterType(type.paramReference); |
2325 } else if (type.syntheticReturnType != null) { | 2273 } else if (type.syntheticReturnType != null) { |
2326 FunctionElementImpl element = | 2274 FunctionElementImpl element = |
2327 new FunctionElementImpl_forLUB(unit, typeParameterContext); | 2275 new FunctionElementImpl_forLUB(unit, typeParameterContext); |
2328 element.parameters = type.syntheticParams | 2276 element.parameters = type.syntheticParams |
2329 .map((UnlinkedParam param) => | 2277 .map((UnlinkedParam param) => |
2330 buildParameter(param, element, synthetic: true)) | 2278 new ParameterElementImpl.forSerializedFactory(param, element, |
| 2279 synthetic: true)) |
2331 .toList(); | 2280 .toList(); |
2332 element.returnType = | 2281 element.returnType = |
2333 buildType(type.syntheticReturnType, typeParameterContext); | 2282 buildType(type.syntheticReturnType, typeParameterContext); |
2334 FunctionTypeImpl result = new FunctionTypeImpl.elementWithNameAndArgs( | 2283 FunctionTypeImpl result = new FunctionTypeImpl.elementWithNameAndArgs( |
2335 element, null, null, false); | 2284 element, null, null, false); |
2336 element.type = result; | 2285 element.type = result; |
2337 return result; | 2286 return result; |
2338 } else { | 2287 } else { |
2339 DartType getTypeArgument(int i) { | 2288 DartType getTypeArgument(int i) { |
2340 if (i < type.typeArguments.length) { | 2289 if (i < type.typeArguments.length) { |
(...skipping 14 matching lines...) Expand all Loading... |
2355 /** | 2304 /** |
2356 * Resynthesize a [FunctionTypeAliasElement] and place it in the | 2305 * Resynthesize a [FunctionTypeAliasElement] and place it in the |
2357 * [unitHolder]. | 2306 * [unitHolder]. |
2358 */ | 2307 */ |
2359 void buildTypedef(UnlinkedTypedef serializedTypedef) { | 2308 void buildTypedef(UnlinkedTypedef serializedTypedef) { |
2360 FunctionTypeAliasElementImpl functionTypeAliasElement = | 2309 FunctionTypeAliasElementImpl functionTypeAliasElement = |
2361 new FunctionTypeAliasElementImpl.forSerialized(serializedTypedef, unit); | 2310 new FunctionTypeAliasElementImpl.forSerialized(serializedTypedef, unit); |
2362 // TODO(scheglov) remove this after delaying parameters and their types | 2311 // TODO(scheglov) remove this after delaying parameters and their types |
2363 currentTypeParameters.add(functionTypeAliasElement.typeParameters); | 2312 currentTypeParameters.add(functionTypeAliasElement.typeParameters); |
2364 functionTypeAliasElement.parameters = serializedTypedef.parameters | 2313 functionTypeAliasElement.parameters = serializedTypedef.parameters |
2365 .map((p) => buildParameter(p, functionTypeAliasElement)) | 2314 .map((p) => new ParameterElementImpl.forSerializedFactory( |
| 2315 p, functionTypeAliasElement)) |
2366 .toList(); | 2316 .toList(); |
2367 unitHolder.addTypeAlias(functionTypeAliasElement); | 2317 unitHolder.addTypeAlias(functionTypeAliasElement); |
2368 // TODO(scheglov) remove this after delaying parameters and their types | 2318 // TODO(scheglov) remove this after delaying parameters and their types |
2369 currentTypeParameters.removeLast(); | 2319 currentTypeParameters.removeLast(); |
2370 assert(currentTypeParameters.isEmpty); | 2320 assert(currentTypeParameters.isEmpty); |
2371 } | 2321 } |
2372 | 2322 |
2373 /** | 2323 /** |
2374 * Resynthesize a [TypeParameterElement], handling all parts of its except | 2324 * Resynthesize a [TypeParameterElement], handling all parts of its except |
2375 * its bound. | 2325 * its bound. |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2798 static String _getElementIdentifier(String name, ReferenceKind kind) { | 2748 static String _getElementIdentifier(String name, ReferenceKind kind) { |
2799 if (kind == ReferenceKind.topLevelPropertyAccessor || | 2749 if (kind == ReferenceKind.topLevelPropertyAccessor || |
2800 kind == ReferenceKind.propertyAccessor) { | 2750 kind == ReferenceKind.propertyAccessor) { |
2801 if (!name.endsWith('=')) { | 2751 if (!name.endsWith('=')) { |
2802 return name + '?'; | 2752 return name + '?'; |
2803 } | 2753 } |
2804 } | 2754 } |
2805 return name; | 2755 return name; |
2806 } | 2756 } |
2807 } | 2757 } |
OLD | NEW |