Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Side by Side Diff: pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart

Issue 2986593002: Resynthesize instance creation expressions from Kernel. (Closed)
Patch Set: Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/element.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/element.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698