| 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 |