OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 analyzer.test.src.summary.resynthesize_kernel_test; | 5 library analyzer.test.src.summary.resynthesize_kernel_test; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
10 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; | 10 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; |
11 import 'package:analyzer/dart/ast/token.dart'; | 11 import 'package:analyzer/dart/ast/token.dart'; |
12 import 'package:analyzer/dart/element/element.dart'; | 12 import 'package:analyzer/dart/element/element.dart'; |
13 import 'package:analyzer/dart/element/type.dart'; | 13 import 'package:analyzer/dart/element/type.dart'; |
14 import 'package:analyzer/file_system/file_system.dart'; | 14 import 'package:analyzer/file_system/file_system.dart'; |
15 import 'package:analyzer/file_system/memory_file_system.dart'; | 15 import 'package:analyzer/file_system/memory_file_system.dart'; |
16 import 'package:analyzer/src/dart/element/element.dart'; | 16 import 'package:analyzer/src/dart/element/element.dart'; |
17 import 'package:analyzer/src/dart/element/type.dart'; | 17 import 'package:analyzer/src/dart/element/type.dart'; |
18 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; | 18 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext; |
19 import 'package:analyzer/src/generated/source.dart'; | 19 import 'package:analyzer/src/generated/source.dart'; |
20 import 'package:analyzer/src/generated/testing/ast_test_factory.dart'; | 20 import 'package:analyzer/src/generated/testing/ast_test_factory.dart'; |
21 import 'package:analyzer/src/summary/resynthesize.dart'; | 21 import 'package:analyzer/src/summary/resynthesize.dart'; |
22 import 'package:front_end/file_system.dart'; | 22 import 'package:front_end/file_system.dart'; |
23 import 'package:front_end/src/base/performace_logger.dart'; | 23 import 'package:front_end/src/base/performace_logger.dart'; |
24 import 'package:front_end/src/fasta/uri_translator_impl.dart'; | 24 import 'package:front_end/src/fasta/uri_translator_impl.dart'; |
25 import 'package:front_end/src/incremental/byte_store.dart'; | 25 import 'package:front_end/src/incremental/byte_store.dart'; |
26 import 'package:front_end/src/incremental/kernel_driver.dart'; | 26 import 'package:front_end/src/incremental/kernel_driver.dart'; |
27 import 'package:kernel/kernel.dart' as kernel; | 27 import 'package:kernel/kernel.dart' as kernel; |
28 import 'package:kernel/target/targets.dart'; | 28 import 'package:kernel/target/targets.dart'; |
| 29 import 'package:kernel/type_environment.dart' as kernel; |
29 import 'package:package_config/packages.dart'; | 30 import 'package:package_config/packages.dart'; |
30 import 'package:path/path.dart' as pathos; | 31 import 'package:path/path.dart' as pathos; |
31 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 32 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
32 | 33 |
33 import '../context/mock_sdk.dart'; | 34 import '../context/mock_sdk.dart'; |
34 import 'resynthesize_common.dart'; | 35 import 'resynthesize_common.dart'; |
35 | 36 |
36 main() { | 37 main() { |
37 defineReflectiveSuite(() { | 38 defineReflectiveSuite(() { |
38 defineReflectiveTests(ResynthesizeKernelStrongTest); | 39 defineReflectiveTests(ResynthesizeKernelStrongTest); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 KernelResult kernelResult = await driver.getKernel(testUri); | 90 KernelResult kernelResult = await driver.getKernel(testUri); |
90 | 91 |
91 var libraryMap = <String, kernel.Library>{}; | 92 var libraryMap = <String, kernel.Library>{}; |
92 for (var cycleResult in kernelResult.results) { | 93 for (var cycleResult in kernelResult.results) { |
93 for (var library in cycleResult.kernelLibraries) { | 94 for (var library in cycleResult.kernelLibraries) { |
94 String uriStr = library.importUri.toString(); | 95 String uriStr = library.importUri.toString(); |
95 libraryMap[uriStr] = library; | 96 libraryMap[uriStr] = library; |
96 } | 97 } |
97 } | 98 } |
98 | 99 |
99 var resynthesizer = new _KernelResynthesizer(context, libraryMap); | 100 var resynthesizer = |
| 101 new _KernelResynthesizer(context, kernelResult.types, libraryMap); |
100 return resynthesizer.getLibrary(testUriStr); | 102 return resynthesizer.getLibrary(testUriStr); |
101 } | 103 } |
102 | 104 |
103 @override | 105 @override |
104 SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource) { | 106 SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource) { |
105 // TODO(scheglov): implement encodeDecodeLibrarySource | 107 // TODO(scheglov): implement encodeDecodeLibrarySource |
106 throw new UnimplementedError(); | 108 throw new UnimplementedError(); |
107 } | 109 } |
108 | 110 |
109 @failingTest | 111 @failingTest |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 test_class_type_parameters_bound() async { | 186 test_class_type_parameters_bound() async { |
185 await super.test_class_type_parameters_bound(); | 187 await super.test_class_type_parameters_bound(); |
186 } | 188 } |
187 | 189 |
188 @failingTest | 190 @failingTest |
189 test_class_type_parameters_f_bound_complex() async { | 191 test_class_type_parameters_f_bound_complex() async { |
190 await super.test_class_type_parameters_f_bound_complex(); | 192 await super.test_class_type_parameters_f_bound_complex(); |
191 } | 193 } |
192 | 194 |
193 @failingTest | 195 @failingTest |
194 test_class_type_parameters_f_bound_simple() async { | |
195 await super.test_class_type_parameters_f_bound_simple(); | |
196 } | |
197 | |
198 @failingTest | |
199 test_closure_generic() async { | 196 test_closure_generic() async { |
200 await super.test_closure_generic(); | 197 await super.test_closure_generic(); |
201 } | 198 } |
202 | 199 |
203 @failingTest | 200 @failingTest |
204 test_closure_in_variable_declaration_in_part() async { | 201 test_closure_in_variable_declaration_in_part() async { |
205 await super.test_closure_in_variable_declaration_in_part(); | 202 await super.test_closure_in_variable_declaration_in_part(); |
206 } | 203 } |
207 | 204 |
208 @failingTest | 205 @failingTest |
(...skipping 10 matching lines...) Expand all Loading... |
219 test_const_invalid_intLiteral() async { | 216 test_const_invalid_intLiteral() async { |
220 await super.test_const_invalid_intLiteral(); | 217 await super.test_const_invalid_intLiteral(); |
221 } | 218 } |
222 | 219 |
223 @failingTest | 220 @failingTest |
224 test_const_invalid_topLevel() async { | 221 test_const_invalid_topLevel() async { |
225 await super.test_const_invalid_topLevel(); | 222 await super.test_const_invalid_topLevel(); |
226 } | 223 } |
227 | 224 |
228 @failingTest | 225 @failingTest |
229 test_const_invokeConstructor_generic_named() async { | |
230 await super.test_const_invokeConstructor_generic_named(); | |
231 } | |
232 | |
233 @failingTest | |
234 test_const_invokeConstructor_generic_named_imported() async { | 226 test_const_invokeConstructor_generic_named_imported() async { |
235 await super.test_const_invokeConstructor_generic_named_imported(); | 227 await super.test_const_invokeConstructor_generic_named_imported(); |
236 } | 228 } |
237 | 229 |
238 @failingTest | 230 @failingTest |
239 test_const_invokeConstructor_generic_named_imported_withPrefix() async { | 231 test_const_invokeConstructor_generic_named_imported_withPrefix() async { |
240 await super | 232 await super |
241 .test_const_invokeConstructor_generic_named_imported_withPrefix(); | 233 .test_const_invokeConstructor_generic_named_imported_withPrefix(); |
242 } | 234 } |
243 | 235 |
244 @failingTest | 236 @failingTest |
245 test_const_invokeConstructor_generic_noTypeArguments() async { | |
246 await super.test_const_invokeConstructor_generic_noTypeArguments(); | |
247 } | |
248 | |
249 @failingTest | |
250 test_const_invokeConstructor_generic_unnamed() async { | |
251 await super.test_const_invokeConstructor_generic_unnamed(); | |
252 } | |
253 | |
254 @failingTest | |
255 test_const_invokeConstructor_generic_unnamed_imported() async { | 237 test_const_invokeConstructor_generic_unnamed_imported() async { |
256 await super.test_const_invokeConstructor_generic_unnamed_imported(); | 238 await super.test_const_invokeConstructor_generic_unnamed_imported(); |
257 } | 239 } |
258 | 240 |
259 @failingTest | 241 @failingTest |
260 test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async { | 242 test_const_invokeConstructor_generic_unnamed_imported_withPrefix() async { |
261 await super | 243 await super |
262 .test_const_invokeConstructor_generic_unnamed_imported_withPrefix(); | 244 .test_const_invokeConstructor_generic_unnamed_imported_withPrefix(); |
263 } | 245 } |
264 | 246 |
265 @failingTest | 247 @failingTest |
266 test_const_invokeConstructor_named() async { | |
267 await super.test_const_invokeConstructor_named(); | |
268 } | |
269 | |
270 @failingTest | |
271 test_const_invokeConstructor_named_imported() async { | 248 test_const_invokeConstructor_named_imported() async { |
272 await super.test_const_invokeConstructor_named_imported(); | 249 await super.test_const_invokeConstructor_named_imported(); |
273 } | 250 } |
274 | 251 |
275 @failingTest | 252 @failingTest |
276 test_const_invokeConstructor_named_imported_withPrefix() async { | 253 test_const_invokeConstructor_named_imported_withPrefix() async { |
277 await super.test_const_invokeConstructor_named_imported_withPrefix(); | 254 await super.test_const_invokeConstructor_named_imported_withPrefix(); |
278 } | 255 } |
279 | 256 |
280 @failingTest | 257 @failingTest |
(...skipping 20 matching lines...) Expand all Loading... |
301 test_const_invokeConstructor_named_unresolved5() async { | 278 test_const_invokeConstructor_named_unresolved5() async { |
302 await super.test_const_invokeConstructor_named_unresolved5(); | 279 await super.test_const_invokeConstructor_named_unresolved5(); |
303 } | 280 } |
304 | 281 |
305 @failingTest | 282 @failingTest |
306 test_const_invokeConstructor_named_unresolved6() async { | 283 test_const_invokeConstructor_named_unresolved6() async { |
307 await super.test_const_invokeConstructor_named_unresolved6(); | 284 await super.test_const_invokeConstructor_named_unresolved6(); |
308 } | 285 } |
309 | 286 |
310 @failingTest | 287 @failingTest |
311 test_const_invokeConstructor_unnamed() async { | |
312 await super.test_const_invokeConstructor_unnamed(); | |
313 } | |
314 | |
315 @failingTest | |
316 test_const_invokeConstructor_unnamed_imported() async { | 288 test_const_invokeConstructor_unnamed_imported() async { |
317 await super.test_const_invokeConstructor_unnamed_imported(); | 289 await super.test_const_invokeConstructor_unnamed_imported(); |
318 } | 290 } |
319 | 291 |
320 @failingTest | 292 @failingTest |
321 test_const_invokeConstructor_unnamed_imported_withPrefix() async { | 293 test_const_invokeConstructor_unnamed_imported_withPrefix() async { |
322 await super.test_const_invokeConstructor_unnamed_imported_withPrefix(); | 294 await super.test_const_invokeConstructor_unnamed_imported_withPrefix(); |
323 } | 295 } |
324 | 296 |
325 @failingTest | 297 @failingTest |
(...skipping 1759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2085 } | 2057 } |
2086 } else if (args.length == 1) { | 2058 } else if (args.length == 1) { |
2087 var operator = _toBinaryOperatorTokenType(operatorName); | 2059 var operator = _toBinaryOperatorTokenType(operatorName); |
2088 var right = build(args.single); | 2060 var right = build(args.single); |
2089 return AstTestFactory.binaryExpression(left, operator, right); | 2061 return AstTestFactory.binaryExpression(left, operator, right); |
2090 } | 2062 } |
2091 } | 2063 } |
2092 } | 2064 } |
2093 } | 2065 } |
2094 | 2066 |
| 2067 if (expr is kernel.ConstructorInvocation) { |
| 2068 var element = _getElement(expr.targetReference); |
| 2069 |
| 2070 var kernelType = expr.getStaticType(_context._resynthesizer._types); |
| 2071 var type = _context.getType(null, kernelType); |
| 2072 TypeName typeName = _buildType(type); |
| 2073 |
| 2074 var constructorName = AstTestFactory.constructorName( |
| 2075 typeName, element.name.isNotEmpty ? element.name : null); |
| 2076 constructorName?.name?.staticElement = element; |
| 2077 |
| 2078 var keyword = expr.isConst ? Keyword.CONST : Keyword.NEW; |
| 2079 var arguments = _toArguments(expr.arguments); |
| 2080 return AstTestFactory.instanceCreationExpression( |
| 2081 keyword, constructorName, arguments); |
| 2082 } |
| 2083 |
2095 // TODO(scheglov): complete getExpression | 2084 // TODO(scheglov): complete getExpression |
2096 throw new UnimplementedError('kernel: (${expr.runtimeType}) $expr'); | 2085 throw new UnimplementedError('kernel: (${expr.runtimeType}) $expr'); |
2097 } | 2086 } |
2098 | 2087 |
2099 Expression _buildIdentifier(kernel.Reference reference, {bool isGet: false}) { | 2088 Expression _buildIdentifier(kernel.Reference reference, {bool isGet: false}) { |
2100 Element element = _getElement(reference); | 2089 Element element = _getElement(reference); |
2101 if (isGet && element is PropertyInducingElement) { | 2090 if (isGet && element is PropertyInducingElement) { |
2102 element = (element as PropertyInducingElement).getter; | 2091 element = (element as PropertyInducingElement).getter; |
2103 } | 2092 } |
2104 SimpleIdentifier property = AstTestFactory.identifier3(element.displayName) | 2093 SimpleIdentifier property = AstTestFactory.identifier3(element.displayName) |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2161 } | 2150 } |
2162 | 2151 |
2163 InterpolationElement _newInterpolationElement(Expression expr) { | 2152 InterpolationElement _newInterpolationElement(Expression expr) { |
2164 if (expr is SimpleStringLiteral) { | 2153 if (expr is SimpleStringLiteral) { |
2165 return astFactory.interpolationString(expr.literal, expr.value); | 2154 return astFactory.interpolationString(expr.literal, expr.value); |
2166 } else { | 2155 } else { |
2167 return AstTestFactory.interpolationExpression(expr); | 2156 return AstTestFactory.interpolationExpression(expr); |
2168 } | 2157 } |
2169 } | 2158 } |
2170 | 2159 |
| 2160 /// Return [Expression]s for the given [kernelArguments]. |
| 2161 List<Expression> _toArguments(kernel.Arguments kernelArguments) { |
| 2162 int numPositional = kernelArguments.positional.length; |
| 2163 int numNamed = kernelArguments.named.length; |
| 2164 var arguments = new List<Expression>(numPositional + numNamed); |
| 2165 |
| 2166 int i = 0; |
| 2167 for (kernel.Expression k in kernelArguments.positional) { |
| 2168 arguments[i++] = build(k); |
| 2169 } |
| 2170 |
| 2171 for (kernel.NamedExpression k in kernelArguments.named) { |
| 2172 var value = build(k.value); |
| 2173 arguments[i++] = AstTestFactory.namedExpression2(k.name, value); |
| 2174 } |
| 2175 |
| 2176 return arguments; |
| 2177 } |
| 2178 |
2171 /// Return the [TokenType] for the given operator [name]. | 2179 /// Return the [TokenType] for the given operator [name]. |
2172 TokenType _toBinaryOperatorTokenType(String name) { | 2180 TokenType _toBinaryOperatorTokenType(String name) { |
2173 if (name == '==') return TokenType.EQ_EQ; | 2181 if (name == '==') return TokenType.EQ_EQ; |
2174 if (name == '&&') return TokenType.AMPERSAND_AMPERSAND; | 2182 if (name == '&&') return TokenType.AMPERSAND_AMPERSAND; |
2175 if (name == '||') return TokenType.BAR_BAR; | 2183 if (name == '||') return TokenType.BAR_BAR; |
2176 if (name == '^') return TokenType.CARET; | 2184 if (name == '^') return TokenType.CARET; |
2177 if (name == '&') return TokenType.AMPERSAND; | 2185 if (name == '&') return TokenType.AMPERSAND; |
2178 if (name == '|') return TokenType.BAR; | 2186 if (name == '|') return TokenType.BAR; |
2179 if (name == '>>') return TokenType.GT_GT; | 2187 if (name == '>>') return TokenType.GT_GT; |
2180 if (name == '<<') return TokenType.LT_LT; | 2188 if (name == '<<') return TokenType.LT_LT; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2253 | 2261 |
2254 @override | 2262 @override |
2255 InterfaceType getInterfaceType( | 2263 InterfaceType getInterfaceType( |
2256 ElementImpl context, kernel.Supertype kernelType) { | 2264 ElementImpl context, kernel.Supertype kernelType) { |
2257 return _getInterfaceType( | 2265 return _getInterfaceType( |
2258 kernelType.className.canonicalName, kernelType.typeArguments); | 2266 kernelType.className.canonicalName, kernelType.typeArguments); |
2259 } | 2267 } |
2260 | 2268 |
2261 DartType getType(ElementImpl context, kernel.DartType kernelType) { | 2269 DartType getType(ElementImpl context, kernel.DartType kernelType) { |
2262 if (kernelType is kernel.DynamicType) return DynamicTypeImpl.instance; | 2270 if (kernelType is kernel.DynamicType) return DynamicTypeImpl.instance; |
| 2271 if (kernelType is kernel.VoidType) return VoidTypeImpl.instance; |
2263 if (kernelType is kernel.InterfaceType) { | 2272 if (kernelType is kernel.InterfaceType) { |
2264 return _getInterfaceType( | 2273 return _getInterfaceType( |
2265 kernelType.className.canonicalName, kernelType.typeArguments); | 2274 kernelType.className.canonicalName, kernelType.typeArguments); |
2266 } | 2275 } |
2267 if (kernelType is kernel.VoidType) return VoidTypeImpl.instance; | 2276 if (kernelType is kernel.TypeParameterType) { |
| 2277 kernel.TypeParameter kTypeParameter = kernelType.parameter; |
| 2278 return _getTypeParameter(context, kTypeParameter).type; |
| 2279 } |
2268 // TODO(scheglov) Support other kernel types. | 2280 // TODO(scheglov) Support other kernel types. |
2269 throw new UnimplementedError('For ${kernelType.runtimeType}'); | 2281 throw new UnimplementedError('For ${kernelType.runtimeType}'); |
2270 } | 2282 } |
2271 | 2283 |
2272 /** | 2284 /** |
2273 * Return the [ElementImpl] that corresponds to the given [name], or `null` | 2285 * Return the [ElementImpl] that corresponds to the given [name], or `null` |
2274 * if the corresponding element cannot be found. | 2286 * if the corresponding element cannot be found. |
2275 */ | 2287 */ |
2276 ElementImpl _getElement(kernel.CanonicalName name) { | 2288 ElementImpl _getElement(kernel.CanonicalName name) { |
2277 if (name == null) return null; | 2289 if (name == null) return null; |
2278 kernel.CanonicalName parentName = name.parent; | 2290 kernel.CanonicalName parentName = name.parent; |
2279 | 2291 |
2280 // If the parent is the root, then this name is a library. | 2292 // If the parent is the root, then this name is a library. |
2281 if (parentName.isRoot) { | 2293 if (parentName.isRoot) { |
2282 return _resynthesizer.getLibrary(name.name); | 2294 return _resynthesizer.getLibrary(name.name); |
2283 } | 2295 } |
2284 | 2296 |
2285 // Skip qualifiers. | 2297 // Skip qualifiers. |
2286 bool isGetter = false; | 2298 bool isGetter = false; |
2287 bool isSetter = false; | 2299 bool isSetter = false; |
2288 bool isField = false; | 2300 bool isField = false; |
| 2301 bool isConstructor = false; |
2289 bool isMethod = false; | 2302 bool isMethod = false; |
2290 if (parentName.name == '@getters') { | 2303 if (parentName.name == '@getters') { |
2291 isGetter = true; | 2304 isGetter = true; |
2292 parentName = parentName.parent; | 2305 parentName = parentName.parent; |
2293 } else if (parentName.name == '@setters') { | 2306 } else if (parentName.name == '@setters') { |
2294 isSetter = true; | 2307 isSetter = true; |
2295 parentName = parentName.parent; | 2308 parentName = parentName.parent; |
2296 } else if (parentName.name == '@fields') { | 2309 } else if (parentName.name == '@fields') { |
2297 isField = true; | 2310 isField = true; |
2298 parentName = parentName.parent; | 2311 parentName = parentName.parent; |
| 2312 } else if (parentName.name == '@constructors') { |
| 2313 isConstructor = true; |
| 2314 parentName = parentName.parent; |
2299 } else if (parentName.name == '@methods') { | 2315 } else if (parentName.name == '@methods') { |
2300 isMethod = true; | 2316 isMethod = true; |
2301 parentName = parentName.parent; | 2317 parentName = parentName.parent; |
2302 } | 2318 } |
2303 | 2319 |
2304 ElementImpl parentElement = _getElement(parentName); | 2320 ElementImpl parentElement = _getElement(parentName); |
2305 if (parentElement == null) return null; | 2321 if (parentElement == null) return null; |
2306 | 2322 |
2307 // Search in units of the library. | 2323 // Search in units of the library. |
2308 if (parentElement is LibraryElementImpl) { | 2324 if (parentElement is LibraryElementImpl) { |
2309 for (CompilationUnitElement unit in parentElement.units) { | 2325 for (CompilationUnitElement unit in parentElement.units) { |
2310 CompilationUnitElementImpl unitImpl = unit; | 2326 CompilationUnitElementImpl unitImpl = unit; |
2311 ElementImpl child = unitImpl.getChild(name.name); | 2327 ElementImpl child = unitImpl.getChild(name.name); |
2312 if (child != null) { | 2328 if (child != null) { |
2313 return child; | 2329 return child; |
2314 } | 2330 } |
2315 } | 2331 } |
2316 return null; | 2332 return null; |
2317 } | 2333 } |
2318 | 2334 |
2319 // Search in the class. | 2335 // Search in the class. |
2320 if (parentElement is ClassElementImpl) { | 2336 if (parentElement is ClassElementImpl) { |
2321 if (isGetter) { | 2337 if (isGetter) { |
2322 return parentElement.getGetter(name.name) as ElementImpl; | 2338 return parentElement.getGetter(name.name) as ElementImpl; |
2323 } else if (isSetter) { | 2339 } else if (isSetter) { |
2324 return parentElement.getSetter(name.name) as ElementImpl; | 2340 return parentElement.getSetter(name.name) as ElementImpl; |
2325 } else if (isField) { | 2341 } else if (isField) { |
2326 return parentElement.getField(name.name) as ElementImpl; | 2342 return parentElement.getField(name.name) as ElementImpl; |
| 2343 } else if (isConstructor) { |
| 2344 if (name.name.isEmpty) { |
| 2345 return parentElement.unnamedConstructor as ConstructorElementImpl; |
| 2346 } |
| 2347 return parentElement.getNamedConstructor(name.name) as ElementImpl; |
2327 } else if (isMethod) { | 2348 } else if (isMethod) { |
2328 return parentElement.getMethod(name.name) as ElementImpl; | 2349 return parentElement.getMethod(name.name) as ElementImpl; |
2329 } | 2350 } |
2330 return null; | 2351 return null; |
2331 } | 2352 } |
2332 | 2353 |
2333 throw new UnimplementedError('Should not be reached.'); | 2354 throw new UnimplementedError('Should not be reached.'); |
2334 } | 2355 } |
2335 | 2356 |
2336 InterfaceType _getInterfaceType( | 2357 InterfaceType _getInterfaceType( |
2337 kernel.CanonicalName className, List<kernel.DartType> kernelArguments) { | 2358 kernel.CanonicalName className, List<kernel.DartType> kernelArguments) { |
2338 var libraryName = className.parent; | 2359 var libraryName = className.parent; |
2339 var libraryElement = _resynthesizer.getLibrary(libraryName.name); | 2360 var libraryElement = _resynthesizer.getLibrary(libraryName.name); |
2340 ClassElementImpl classElement = libraryElement.getType(className.name); | 2361 ClassElementImpl classElement = libraryElement.getType(className.name); |
2341 | 2362 |
2342 if (kernelArguments.isEmpty) { | 2363 if (kernelArguments.isEmpty) { |
2343 return classElement.type; | 2364 return classElement.type; |
2344 } | 2365 } |
2345 | 2366 |
2346 return new InterfaceTypeImpl.elementWithNameAndArgs( | 2367 return new InterfaceTypeImpl.elementWithNameAndArgs( |
2347 classElement, classElement.name, () { | 2368 classElement, classElement.name, () { |
2348 List<DartType> arguments = kernelArguments | 2369 List<DartType> arguments = kernelArguments |
2349 .map((kernel.DartType k) => getType(classElement, k)) | 2370 .map((kernel.DartType k) => getType(classElement, k)) |
2350 .toList(growable: false); | 2371 .toList(growable: false); |
2351 return arguments; | 2372 return arguments; |
2352 }); | 2373 }); |
2353 } | 2374 } |
| 2375 |
| 2376 /// Return the [TypeParameterElement] for the given [kernelTypeParameter]. |
| 2377 TypeParameterElement _getTypeParameter( |
| 2378 ElementImpl context, kernel.TypeParameter kernelTypeParameter) { |
| 2379 String name = kernelTypeParameter.name; |
| 2380 for (var ctx = context; ctx != null; ctx = ctx.enclosingElement) { |
| 2381 if (ctx is TypeParameterizedElementMixin) { |
| 2382 for (var typeParameter in ctx.typeParameters) { |
| 2383 if (typeParameter.name == name) { |
| 2384 return typeParameter; |
| 2385 } |
| 2386 } |
| 2387 } |
| 2388 } |
| 2389 throw new StateError('Not found $kernelTypeParameter in $context'); |
| 2390 } |
2354 } | 2391 } |
2355 | 2392 |
2356 class _KernelResynthesizer { | 2393 class _KernelResynthesizer { |
2357 final AnalysisContext _analysisContext; | 2394 final AnalysisContext _analysisContext; |
| 2395 final kernel.TypeEnvironment _types; |
2358 final Map<String, kernel.Library> _kernelMap; | 2396 final Map<String, kernel.Library> _kernelMap; |
2359 final Map<String, LibraryElementImpl> _libraryMap = {}; | 2397 final Map<String, LibraryElementImpl> _libraryMap = {}; |
2360 | 2398 |
2361 /** | 2399 /** |
2362 * Cache of [Source] objects that have already been converted from URIs. | 2400 * Cache of [Source] objects that have already been converted from URIs. |
2363 */ | 2401 */ |
2364 final Map<String, Source> _sources = <String, Source>{}; | 2402 final Map<String, Source> _sources = <String, Source>{}; |
2365 | 2403 |
2366 _KernelResynthesizer(this._analysisContext, this._kernelMap); | 2404 _KernelResynthesizer(this._analysisContext, this._types, this._kernelMap); |
2367 | 2405 |
2368 LibraryElementImpl getLibrary(String uriStr) { | 2406 LibraryElementImpl getLibrary(String uriStr) { |
2369 return _libraryMap.putIfAbsent(uriStr, () { | 2407 return _libraryMap.putIfAbsent(uriStr, () { |
2370 var kernel = _kernelMap[uriStr]; | 2408 var kernel = _kernelMap[uriStr]; |
2371 if (kernel == null) return null; | 2409 if (kernel == null) return null; |
2372 | 2410 |
2373 var libraryContext = | 2411 var libraryContext = |
2374 new _KernelLibraryResynthesizerContextImpl(this, kernel); | 2412 new _KernelLibraryResynthesizerContextImpl(this, kernel); |
2375 Source librarySource = _getSource(uriStr); | 2413 Source librarySource = _getSource(uriStr); |
2376 LibraryElementImpl libraryElement = | 2414 LibraryElementImpl libraryElement = |
2377 new LibraryElementImpl.forKernel(_analysisContext, libraryContext); | 2415 new LibraryElementImpl.forKernel(_analysisContext, libraryContext); |
2378 CompilationUnitElementImpl definingUnit = | 2416 CompilationUnitElementImpl definingUnit = |
2379 libraryElement.definingCompilationUnit; | 2417 libraryElement.definingCompilationUnit; |
2380 definingUnit.source = librarySource; | 2418 definingUnit.source = librarySource; |
2381 definingUnit.librarySource = librarySource; | 2419 definingUnit.librarySource = librarySource; |
2382 return libraryElement; | 2420 return libraryElement; |
2383 }); | 2421 }); |
2384 } | 2422 } |
2385 | 2423 |
2386 /** | 2424 /** |
2387 * Get the [Source] object for the given [uri]. | 2425 * Get the [Source] object for the given [uri]. |
2388 */ | 2426 */ |
2389 Source _getSource(String uri) { | 2427 Source _getSource(String uri) { |
2390 return _sources.putIfAbsent( | 2428 return _sources.putIfAbsent( |
2391 uri, () => _analysisContext.sourceFactory.forUri(uri)); | 2429 uri, () => _analysisContext.sourceFactory.forUri(uri)); |
2392 } | 2430 } |
2393 } | 2431 } |
OLD | NEW |