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 dart2js.kernel.env; | 5 library dart2js.kernel.env; |
6 | 6 |
7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
8 import 'package:kernel/clone.dart'; | 8 import 'package:kernel/clone.dart'; |
9 import 'package:kernel/type_algebra.dart'; | 9 import 'package:kernel/type_algebra.dart'; |
10 | 10 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 } else { | 150 } else { |
151 // Skip fields; these are also in _memberMap. | 151 // Skip fields; these are also in _memberMap. |
152 } | 152 } |
153 } | 153 } |
154 } | 154 } |
155 } | 155 } |
156 | 156 |
157 /// Environment for fast lookup of class members. | 157 /// Environment for fast lookup of class members. |
158 class ClassEnv { | 158 class ClassEnv { |
159 final ir.Class cls; | 159 final ir.Class cls; |
160 bool isMixinApplication; | |
161 final bool isUnnamedMixinApplication; | 160 final bool isUnnamedMixinApplication; |
162 | 161 |
163 InterfaceType thisType; | |
164 InterfaceType rawType; | |
165 InterfaceType supertype; | |
166 InterfaceType mixedInType; | |
167 List<InterfaceType> interfaces; | |
168 OrderedTypeSet orderedTypeSet; | |
169 | |
170 Map<String, ir.Member> _constructorMap; | 162 Map<String, ir.Member> _constructorMap; |
171 Map<String, ir.Member> _memberMap; | 163 Map<String, ir.Member> _memberMap; |
172 Map<String, ir.Member> _setterMap; | 164 Map<String, ir.Member> _setterMap; |
173 | 165 |
174 Iterable<ConstantValue> _metadata; | |
175 | |
176 ClassEnv(this.cls) | 166 ClassEnv(this.cls) |
177 // TODO(johnniwinther): Change this to use a property on [cls] when such | 167 // TODO(johnniwinther): Change this to use a property on [cls] when such |
178 // is added to kernel. | 168 // is added to kernel. |
179 : isUnnamedMixinApplication = | 169 : isUnnamedMixinApplication = |
180 cls.name.contains('+') || cls.name.contains('&'); | 170 cls.name.contains('+') || cls.name.contains('&'); |
181 | 171 |
182 /// Copied from 'package:kernel/transformations/mixin_full_resolution.dart'. | 172 /// Copied from 'package:kernel/transformations/mixin_full_resolution.dart'. |
183 ir.Constructor _buildForwardingConstructor( | 173 ir.Constructor _buildForwardingConstructor( |
184 CloneVisitor cloner, ir.Constructor superclassConstructor) { | 174 CloneVisitor cloner, ir.Constructor superclassConstructor) { |
185 var superFunction = superclassConstructor.function; | 175 var superFunction = superclassConstructor.function; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 } else { | 296 } else { |
307 // Skip fields; these are also in _memberMap. | 297 // Skip fields; these are also in _memberMap. |
308 } | 298 } |
309 } | 299 } |
310 } | 300 } |
311 | 301 |
312 void forEachConstructor(void f(ir.Member member)) { | 302 void forEachConstructor(void f(ir.Member member)) { |
313 _ensureMaps(); | 303 _ensureMaps(); |
314 _constructorMap.values.forEach(f); | 304 _constructorMap.values.forEach(f); |
315 } | 305 } |
| 306 } |
| 307 |
| 308 class ClassData { |
| 309 final ir.Class cls; |
| 310 bool isMixinApplication; |
| 311 |
| 312 InterfaceType thisType; |
| 313 InterfaceType rawType; |
| 314 InterfaceType supertype; |
| 315 InterfaceType mixedInType; |
| 316 List<InterfaceType> interfaces; |
| 317 OrderedTypeSet orderedTypeSet; |
| 318 |
| 319 Iterable<ConstantValue> _metadata; |
| 320 |
| 321 ClassData(this.cls); |
316 | 322 |
317 Iterable<ConstantValue> getMetadata(KernelToElementMapBase elementMap) { | 323 Iterable<ConstantValue> getMetadata(KernelToElementMapBase elementMap) { |
318 return _metadata ??= elementMap.getMetadata(cls.annotations); | 324 return _metadata ??= elementMap.getMetadata(cls.annotations); |
319 } | 325 } |
| 326 |
| 327 ClassData copy() { |
| 328 return new ClassData(cls); |
| 329 } |
320 } | 330 } |
321 | 331 |
322 class MemberData { | 332 class MemberData { |
323 final ir.Member node; | 333 final ir.Member node; |
324 Iterable<ConstantValue> _metadata; | 334 Iterable<ConstantValue> _metadata; |
325 | 335 |
326 MemberData(this.node); | 336 MemberData(this.node); |
327 | 337 |
328 ResolutionImpact getWorldImpact(KernelToElementMapForImpact elementMap) { | 338 ResolutionImpact getWorldImpact(KernelToElementMapForImpact elementMap) { |
329 return buildKernelImpact(node, elementMap); | 339 return buildKernelImpact(node, elementMap); |
330 } | 340 } |
331 | 341 |
332 Iterable<ConstantValue> getMetadata(KernelToElementMapBase elementMap) { | 342 Iterable<ConstantValue> getMetadata(KernelToElementMapBase elementMap) { |
333 return _metadata ??= elementMap.getMetadata(node.annotations); | 343 return _metadata ??= elementMap.getMetadata(node.annotations); |
334 } | 344 } |
| 345 |
| 346 MemberData copy() { |
| 347 return new MemberData(node); |
| 348 } |
335 } | 349 } |
336 | 350 |
337 class FunctionData extends MemberData { | 351 class FunctionData extends MemberData { |
338 final ir.FunctionNode functionNode; | 352 final ir.FunctionNode functionNode; |
339 FunctionType _type; | 353 FunctionType _type; |
340 | 354 |
341 FunctionData(ir.Member node, this.functionNode) : super(node); | 355 FunctionData(ir.Member node, this.functionNode) : super(node); |
342 | 356 |
343 FunctionType getFunctionType(KernelToElementMapBase elementMap) { | 357 FunctionType getFunctionType(KernelToElementMapBase elementMap) { |
344 return _type ??= elementMap.getFunctionType(functionNode); | 358 return _type ??= elementMap.getFunctionType(functionNode); |
(...skipping 16 matching lines...) Expand all Loading... |
361 } | 375 } |
362 | 376 |
363 for (int i = 0; i < functionNode.positionalParameters.length; i++) { | 377 for (int i = 0; i < functionNode.positionalParameters.length; i++) { |
364 handleParameter(functionNode.positionalParameters[i], | 378 handleParameter(functionNode.positionalParameters[i], |
365 isOptional: i < functionNode.requiredParameterCount); | 379 isOptional: i < functionNode.requiredParameterCount); |
366 } | 380 } |
367 functionNode.namedParameters.toList() | 381 functionNode.namedParameters.toList() |
368 ..sort(namedOrdering) | 382 ..sort(namedOrdering) |
369 ..forEach(handleParameter); | 383 ..forEach(handleParameter); |
370 } | 384 } |
| 385 |
| 386 @override |
| 387 FunctionData copy() { |
| 388 return new FunctionData(node, functionNode); |
| 389 } |
371 } | 390 } |
372 | 391 |
373 class ConstructorData extends FunctionData { | 392 class ConstructorData extends FunctionData { |
374 ConstantConstructor _constantConstructor; | 393 ConstantConstructor _constantConstructor; |
375 | 394 |
376 ConstructorData(ir.Member node, ir.FunctionNode functionNode) | 395 ConstructorData(ir.Member node, ir.FunctionNode functionNode) |
377 : super(node, functionNode); | 396 : super(node, functionNode); |
378 | 397 |
379 ConstantConstructor getConstructorConstant( | 398 ConstantConstructor getConstructorConstant( |
380 KernelToElementMapBase elementMap, ConstructorEntity constructor) { | 399 KernelToElementMapBase elementMap, ConstructorEntity constructor) { |
381 if (_constantConstructor == null) { | 400 if (_constantConstructor == null) { |
382 if (node is ir.Constructor && constructor.isConst) { | 401 if (node is ir.Constructor && constructor.isConst) { |
383 _constantConstructor = | 402 _constantConstructor = |
384 new Constantifier(elementMap).computeConstantConstructor(node); | 403 new Constantifier(elementMap).computeConstantConstructor(node); |
385 } else { | 404 } else { |
386 throw new SpannableAssertionFailure( | 405 throw new SpannableAssertionFailure( |
387 constructor, | 406 constructor, |
388 "Unexpected constructor $constructor in " | 407 "Unexpected constructor $constructor in " |
389 "KernelWorldBuilder._getConstructorConstant"); | 408 "KernelWorldBuilder._getConstructorConstant"); |
390 } | 409 } |
391 } | 410 } |
392 return _constantConstructor; | 411 return _constantConstructor; |
393 } | 412 } |
| 413 |
| 414 @override |
| 415 ConstructorData copy() { |
| 416 return new ConstructorData(node, functionNode); |
| 417 } |
394 } | 418 } |
395 | 419 |
396 class FieldData extends MemberData { | 420 class FieldData extends MemberData { |
397 ConstantExpression _constant; | 421 ConstantExpression _constant; |
398 | 422 |
399 FieldData(ir.Field node) : super(node); | 423 FieldData(ir.Field node) : super(node); |
400 | 424 |
401 ir.Field get node => super.node; | 425 ir.Field get node => super.node; |
402 | 426 |
403 ConstantExpression getFieldConstant( | 427 ConstantExpression getFieldConstant( |
404 KernelToElementMapBase elementMap, FieldEntity field) { | 428 KernelToElementMapBase elementMap, FieldEntity field) { |
405 if (_constant == null) { | 429 if (_constant == null) { |
406 if (node.isConst) { | 430 if (node.isConst) { |
407 _constant = new Constantifier(elementMap).visit(node.initializer); | 431 _constant = new Constantifier(elementMap).visit(node.initializer); |
408 } else { | 432 } else { |
409 throw new SpannableAssertionFailure( | 433 throw new SpannableAssertionFailure( |
410 field, | 434 field, |
411 "Unexpected field $field in " | 435 "Unexpected field $field in " |
412 "KernelWorldBuilder._getConstructorConstant"); | 436 "KernelWorldBuilder._getConstructorConstant"); |
413 } | 437 } |
414 } | 438 } |
415 return _constant; | 439 return _constant; |
416 } | 440 } |
| 441 |
| 442 @override |
| 443 FieldData copy() { |
| 444 return new FieldData(node); |
| 445 } |
417 } | 446 } |
OLD | NEW |