OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
5 import 'dart:collection' show Queue; | 5 import 'dart:collection' show Queue; |
6 | 6 |
7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
8 import 'package:kernel/checks.dart' show CheckParentPointers; | 8 import 'package:kernel/checks.dart' show CheckParentPointers; |
9 import 'package:kernel/frontend/super_calls.dart' show moveSuperCallLast; | |
10 | 9 |
11 import '../compiler.dart' show Compiler; | 10 import '../compiler.dart' show Compiler; |
12 import '../constants/expressions.dart' show TypeConstantExpression; | 11 import '../constants/expressions.dart' show TypeConstantExpression; |
13 import '../dart_types.dart' | 12 import '../dart_types.dart' |
14 show DartType, FunctionType, InterfaceType, TypeKind, TypeVariableType; | 13 show DartType, FunctionType, InterfaceType, TypeKind, TypeVariableType; |
15 import '../diagnostics/messages.dart' show MessageKind; | 14 import '../diagnostics/messages.dart' show MessageKind; |
16 import '../diagnostics/spannable.dart' show Spannable; | 15 import '../diagnostics/spannable.dart' show Spannable; |
17 import '../elements/elements.dart' | 16 import '../elements/elements.dart' |
18 show | 17 show |
19 ClassElement, | 18 ClassElement, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
54 <TypeVariableElement, ir.TypeParameter>{}; | 53 <TypeVariableElement, ir.TypeParameter>{}; |
55 | 54 |
56 final Map<TypeVariableElement, ir.TypeParameter> factoryTypeParameters = | 55 final Map<TypeVariableElement, ir.TypeParameter> factoryTypeParameters = |
57 <TypeVariableElement, ir.TypeParameter>{}; | 56 <TypeVariableElement, ir.TypeParameter>{}; |
58 | 57 |
59 final Set<ir.TreeNode> checkedNodes = new Set<ir.TreeNode>(); | 58 final Set<ir.TreeNode> checkedNodes = new Set<ir.TreeNode>(); |
60 | 59 |
61 final Map<LibraryElement, Map<String, int>> mixinApplicationNamesByLibrary = | 60 final Map<LibraryElement, Map<String, int>> mixinApplicationNamesByLibrary = |
62 <LibraryElement, Map<String, int>>{}; | 61 <LibraryElement, Map<String, int>>{}; |
63 | 62 |
63 final Map<ir.Node, Element> nodeToElement = <ir.Node, Element>{}; | |
64 final Map<ir.Node, Node> nodeToAst = <ir.Node, Node>{}; | |
65 | |
64 /// FIFO queue of work that needs to be completed before the returned AST | 66 /// FIFO queue of work that needs to be completed before the returned AST |
65 /// nodes are correct. | 67 /// nodes are correct. |
66 final Queue<WorkItem> workQueue = new Queue<WorkItem>(); | 68 final Queue<WorkItem> workQueue = new Queue<WorkItem>(); |
67 | 69 |
68 Kernel(this.compiler); | 70 Kernel(this.compiler); |
69 | 71 |
70 void addWork(Element element, WorkAction action) { | 72 void addWork(Element element, WorkAction action) { |
71 workQueue.addLast(new WorkItem(element, action)); | 73 workQueue.addLast(new WorkItem(element, action)); |
72 } | 74 } |
73 | 75 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
155 Map<String, int> mixinApplicationNames = mixinApplicationNamesByLibrary | 157 Map<String, int> mixinApplicationNames = mixinApplicationNamesByLibrary |
156 .putIfAbsent(cls.library.implementation, () => <String, int>{}); | 158 .putIfAbsent(cls.library.implementation, () => <String, int>{}); |
157 int count = mixinApplicationNames.putIfAbsent(name, () => 0); | 159 int count = mixinApplicationNames.putIfAbsent(name, () => 0); |
158 mixinApplicationNames[name] = count + 1; | 160 mixinApplicationNames[name] = count + 1; |
159 return "$name#$count"; | 161 return "$name#$count"; |
160 } | 162 } |
161 | 163 |
162 ir.Class classToIr(ClassElement cls) { | 164 ir.Class classToIr(ClassElement cls) { |
163 cls = cls.declaration; | 165 cls = cls.declaration; |
164 return classes.putIfAbsent(cls, () { | 166 return classes.putIfAbsent(cls, () { |
167 cls.ensureResolved(compiler.resolution); | |
168 compiler.enqueuer.resolution.emptyDeferredQueueForTesting(); | |
165 String name = computeName(cls); | 169 String name = computeName(cls); |
166 ir.Class classNode = new ir.Class( | 170 ir.Class classNode = new ir.Class( |
167 name: name, | 171 name: name, |
168 isAbstract: cls.isAbstract, | 172 isAbstract: cls.isAbstract, |
169 typeParameters: null, | 173 typeParameters: null, |
170 implementedTypes: null, | 174 implementedTypes: null, |
171 constructors: null, | 175 constructors: null, |
172 procedures: null, | 176 procedures: null, |
173 fields: null); | 177 fields: null); |
174 addWork(cls, () { | 178 addWork(cls, () { |
175 if (cls.supertype != null) { | 179 if (cls.supertype != null) { |
176 classNode.supertype = interfaceTypeToIr(cls.supertype); | 180 classNode.supertype = interfaceTypeToIr(cls.supertype); |
177 } | 181 } |
178 classNode.parent = libraryToIr(cls.library); | 182 classNode.parent = libraryToIr(cls.library); |
179 if (cls.isUnnamedMixinApplication) { | 183 if (cls.isUnnamedMixinApplication) { |
180 classNode.enclosingLibrary.addClass(classNode); | 184 classNode.enclosingLibrary.addClass(classNode); |
181 } | 185 } |
182 cls.implementation | 186 cls.implementation |
183 .forEachMember((ClassElement enclosingClass, Element member) { | 187 .forEachMember((ClassElement enclosingClass, Element member) { |
184 if (member.enclosingClass.declaration != cls) { | 188 if (member.enclosingClass.declaration != cls) { |
185 internalError(cls, "`$member` isn't mine."); | 189 // TODO(het): figure out why impact_test triggers this |
190 //internalError(cls, "`$member` isn't mine."); | |
186 } else if (member.isFunction || | 191 } else if (member.isFunction || |
187 member.isAccessor || | 192 member.isAccessor || |
188 member.isConstructor) { | 193 member.isConstructor) { |
189 classNode.addMember(functionToIr(member)); | 194 classNode.addMember(functionToIr(member)); |
190 } else if (member.isField) { | 195 } else if (member.isField) { |
191 classNode.addMember(fieldToIr(member)); | 196 classNode.addMember(fieldToIr(member)); |
192 } else { | 197 } else { |
193 internalError(member, "Unhandled class member: $member"); | 198 internalError(member, "Unhandled class member: $member"); |
194 } | 199 } |
195 }); | 200 }); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
314 internalError(function, "Deferred loader."); | 319 internalError(function, "Deferred loader."); |
315 } | 320 } |
316 if (function.isLocal) { | 321 if (function.isLocal) { |
317 internalError(function, "Local function."); | 322 internalError(function, "Local function."); |
318 } | 323 } |
319 if (isSyntheticError(function)) { | 324 if (isSyntheticError(function)) { |
320 internalError(function, "Synthetic error function: $function."); | 325 internalError(function, "Synthetic error function: $function."); |
321 } | 326 } |
322 function = function.declaration; | 327 function = function.declaration; |
323 return functions.putIfAbsent(function, () { | 328 return functions.putIfAbsent(function, () { |
329 compiler.analyzeElement(function); | |
330 compiler.enqueuer.resolution.emptyDeferredQueueForTesting(); | |
324 function = function.implementation; | 331 function = function.implementation; |
325 ir.Member member; | 332 ir.Member member; |
326 ir.Constructor constructor; | 333 ir.Constructor constructor; |
327 ir.Procedure procedure; | 334 ir.Procedure procedure; |
328 ir.Name name = irName(function.name, function); | 335 ir.Name name = irName(function.name, function); |
329 bool isNative = isNativeMethod(function); | 336 bool isNative = isNativeMethod(function); |
330 if (function.isGenerativeConstructor) { | 337 if (function.isGenerativeConstructor) { |
331 member = constructor = new ir.Constructor(null, | 338 member = constructor = new ir.Constructor(null, |
332 name: name, | 339 name: name, |
333 isConst: function.isConst, | 340 isConst: function.isConst, |
(...skipping 17 matching lines...) Expand all Loading... | |
351 // TODO(ahe): Add addFunction/set function to [ir.Procedure]. | 358 // TODO(ahe): Add addFunction/set function to [ir.Procedure]. |
352 irFunction.node.parent = member; | 359 irFunction.node.parent = member; |
353 if (irFunction.isConstructor) { | 360 if (irFunction.isConstructor) { |
354 assert(irFunction.kind == null); | 361 assert(irFunction.kind == null); |
355 constructor.function = irFunction.node; | 362 constructor.function = irFunction.node; |
356 constructor.initializers = irFunction.initializers; | 363 constructor.initializers = irFunction.initializers; |
357 // TODO(ahe): Add setInitializers to [ir.Constructor]. | 364 // TODO(ahe): Add setInitializers to [ir.Constructor]. |
358 for (ir.Initializer initializer in irFunction.initializers) { | 365 for (ir.Initializer initializer in irFunction.initializers) { |
359 initializer.parent = constructor; | 366 initializer.parent = constructor; |
360 } | 367 } |
361 moveSuperCallLast(constructor); | |
Siggi Cherem (dart-lang)
2016/09/09 22:49:23
any reason this is removed?
Harry Terkelsen
2016/09/09 22:56:47
Not 100% sure. As part of this CL I also merged th
| |
362 } else { | 368 } else { |
363 assert(irFunction.kind != null); | 369 assert(irFunction.kind != null); |
364 procedure.function = irFunction.node; | 370 procedure.function = irFunction.node; |
365 procedure.kind = irFunction.kind; | 371 procedure.kind = irFunction.kind; |
366 } | 372 } |
367 endFactoryScope(function); | 373 endFactoryScope(function); |
368 assert(() { | 374 assert(() { |
369 visitor.locals.forEach(checkMember); | 375 visitor.locals.forEach(checkMember); |
370 return true; | 376 return true; |
371 }); | 377 }); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
404 void endFactoryScope(FunctionElement function) { | 410 void endFactoryScope(FunctionElement function) { |
405 factoryTypeParameters.clear(); | 411 factoryTypeParameters.clear(); |
406 } | 412 } |
407 | 413 |
408 ir.Field fieldToIr(FieldElement field) { | 414 ir.Field fieldToIr(FieldElement field) { |
409 if (isSyntheticError(field)) { | 415 if (isSyntheticError(field)) { |
410 internalError(field, "Synthetic error field: $field."); | 416 internalError(field, "Synthetic error field: $field."); |
411 } | 417 } |
412 field = field.declaration; | 418 field = field.declaration; |
413 return fields.putIfAbsent(field, () { | 419 return fields.putIfAbsent(field, () { |
420 compiler.analyzeElement(field); | |
421 compiler.enqueuer.resolution.emptyDeferredQueueForTesting(); | |
414 field = field.implementation; | 422 field = field.implementation; |
415 ir.DartType type = | 423 ir.DartType type = |
416 field.isMalformed ? const ir.InvalidType() : typeToIr(field.type); | 424 field.isMalformed ? const ir.InvalidType() : typeToIr(field.type); |
417 ir.Field fieldNode = new ir.Field(irName(field.memberName.text, field), | 425 ir.Field fieldNode = new ir.Field(irName(field.memberName.text, field), |
418 type: type, | 426 type: type, |
419 initializer: null, | 427 initializer: null, |
420 isFinal: field.isFinal, | 428 isFinal: field.isFinal, |
421 isStatic: field.isStatic || field.isTopLevel, | 429 isStatic: field.isStatic || field.isTopLevel, |
422 isConst: field.isConst); | 430 isConst: field.isConst); |
423 addWork(field, () { | 431 addWork(field, () { |
(...skipping 14 matching lines...) Expand all Loading... | |
438 ir.TypeParameter typeVariableToIr(TypeVariableElement variable) { | 446 ir.TypeParameter typeVariableToIr(TypeVariableElement variable) { |
439 variable = variable.declaration; | 447 variable = variable.declaration; |
440 ir.TypeParameter parameter = factoryTypeParameters[variable]; | 448 ir.TypeParameter parameter = factoryTypeParameters[variable]; |
441 if (parameter != null) return parameter; | 449 if (parameter != null) return parameter; |
442 return typeParameters.putIfAbsent(variable, () { | 450 return typeParameters.putIfAbsent(variable, () { |
443 ir.TypeParameter parameter = new ir.TypeParameter(variable.name, null); | 451 ir.TypeParameter parameter = new ir.TypeParameter(variable.name, null); |
444 addWork(variable, () { | 452 addWork(variable, () { |
445 // TODO(ahe): This assignment will probably not be correct when dart2js | 453 // TODO(ahe): This assignment will probably not be correct when dart2js |
446 // supports generic methods. | 454 // supports generic methods. |
447 ClassElement cls = variable.typeDeclaration; | 455 ClassElement cls = variable.typeDeclaration; |
456 cls.ensureResolved(compiler.resolution); | |
448 parameter.parent = classToIr(cls); | 457 parameter.parent = classToIr(cls); |
449 parameter.bound = typeToIr(variable.bound); | 458 parameter.bound = typeToIr(variable.bound); |
450 }); | 459 }); |
451 return parameter; | 460 return parameter; |
452 }); | 461 }); |
453 } | 462 } |
454 | 463 |
455 List<ir.TypeParameter> typeVariablesToIr(List<DartType> variables) { | 464 List<ir.TypeParameter> typeVariablesToIr(List<DartType> variables) { |
456 List<ir.TypeParameter> result = | 465 List<ir.TypeParameter> result = |
457 new List<ir.TypeParameter>(variables.length); | 466 new List<ir.TypeParameter>(variables.length); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
575 } | 584 } |
576 | 585 |
577 class ConstructorTarget { | 586 class ConstructorTarget { |
578 final ConstructorElement element; | 587 final ConstructorElement element; |
579 final DartType type; | 588 final DartType type; |
580 | 589 |
581 ConstructorTarget(this.element, this.type); | 590 ConstructorTarget(this.element, this.type); |
582 | 591 |
583 String toString() => "ConstructorTarget($element, $type)"; | 592 String toString() => "ConstructorTarget($element, $type)"; |
584 } | 593 } |
OLD | NEW |