Index: pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
index e50a7d7ee1ea6f54ff82d02a251d4f9fe324cd21..f0290b08eb0f00bf4d22075fa22ada35ffdb951d 100644 |
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart |
@@ -15,16 +15,8 @@ import '../../constants/values.dart' |
import '../../common_elements.dart' show CommonElements, ElementEnvironment; |
import '../../deferred_load.dart' show DeferredLoadTask, OutputUnit; |
import '../../elements/elements.dart' |
- show |
- ClassElement, |
- FieldElement, |
- FunctionSignature, |
- LibraryElement, |
- MemberElement, |
- MethodElement, |
- ParameterElement; |
+ show ClassElement, FieldElement, LibraryElement, MethodElement; |
import '../../elements/entities.dart'; |
-import '../../elements/resolution_types.dart' show ResolutionDartType; |
import '../../elements/types.dart'; |
import '../../js/js.dart' as js; |
import '../../js_backend/backend.dart' show SuperMemberData; |
@@ -192,7 +184,7 @@ class ProgramBuilder { |
/// |
/// Also contains classes that are not tracked by the profile run (like |
/// interceptors, ...). |
- Set<ClassElement> _notSoftDeferred; |
+ Set<ClassEntity> _notSoftDeferred; |
Program buildProgram({bool storeFunctionTypesInMetadata: false}) { |
collector.collect(); |
@@ -326,16 +318,17 @@ class ProgramBuilder { |
String data = new File(allocatedClassesPath).readAsStringSync(); |
Set<String> allocatedClassesKeys = JSON.decode(data).keys.toSet(); |
- Set<ClassElement> allocatedClasses = new Set<ClassElement>(); |
+ Set<ClassEntity> allocatedClasses = new Set<ClassEntity>(); |
// Collects all super and mixin classes of a class. |
- void collect(ClassElement element) { |
+ void collect(ClassEntity element) { |
allocatedClasses.add(element); |
- if (element.isMixinApplication) { |
+ if (_elementEnvironment.isMixinApplication(element)) { |
collect(_elementEnvironment.getEffectiveMixinClass(element)); |
} |
- if (element.superclass != null) { |
- collect(element.superclass); |
+ ClassEntity superclass = _elementEnvironment.getSuperClass(element); |
+ if (superclass != null) { |
+ collect(superclass); |
} |
} |
@@ -343,7 +336,7 @@ class ProgramBuilder { |
// collect its dependencies (supers and mixins) and mark them as |
// not-soft-deferrable. |
collector.outputClassLists.forEach((_, List<ClassEntity> elements) { |
- for (ClassElement element in elements) { |
+ for (ClassEntity element in elements) { |
// TODO(29574): share the encoding of the element with the code |
// that emits the profile-run. |
var key = "${element.library.canonicalUri}:${element.name}"; |
@@ -562,7 +555,7 @@ class ProgramBuilder { |
if (member.isFunction) { |
MethodElement fn = member; |
- functionType = fn.type; |
+ functionType = _elementEnvironment.getFunctionType(fn); |
} else if (member.isGetter) { |
if (_options.trustTypeAnnotations) { |
DartType returnType = |
@@ -786,7 +779,7 @@ class ProgramBuilder { |
for (Field field in instanceFields) { |
if (field.needsCheckedSetter) { |
assert(!field.needsUncheckedSetter); |
- FieldElement element = field.element; |
+ FieldEntity element = field.element; |
js.Expression code = _generatedCode[element]; |
assert(code != null); |
js.Name name = _namer.deriveSetterName(field.accessorName); |
@@ -863,23 +856,28 @@ class ProgramBuilder { |
_closedWorld.getMightBePassedToApply(method); |
} |
- /* Map | List */ _computeParameterDefaultValues(FunctionSignature signature) { |
+ /* Map | List */ _computeParameterDefaultValues(FunctionEntity method) { |
var /* Map | List */ optionalParameterDefaultValues; |
- if (signature.optionalParametersAreNamed) { |
+ ParameterStructure parameterStructure = method.parameterStructure; |
+ if (parameterStructure.namedParameters.isNotEmpty) { |
optionalParameterDefaultValues = new Map<String, ConstantValue>(); |
- signature.forEachOptionalParameter((_parameter) { |
- ParameterElement parameter = _parameter; |
- ConstantValue def = |
- _constantHandler.getConstantValue(parameter.constant); |
- optionalParameterDefaultValues[parameter.name] = def; |
+ _worldBuilder.forEachParameter(method, |
+ (DartType type, String name, ConstantValue defaultValue) { |
+ if (parameterStructure.namedParameters.contains(name)) { |
+ assert(defaultValue != null); |
+ optionalParameterDefaultValues[name] = defaultValue; |
+ } |
}); |
} else { |
optionalParameterDefaultValues = <ConstantValue>[]; |
- signature.forEachOptionalParameter((_parameter) { |
- ParameterElement parameter = _parameter; |
- ConstantValue def = |
- _constantHandler.getConstantValue(parameter.constant); |
- optionalParameterDefaultValues.add(def); |
+ int index = 0; |
+ _worldBuilder.forEachParameter(method, |
+ (DartType type, String name, ConstantValue defaultValue) { |
+ if (index >= parameterStructure.requiredParameters) { |
+ assert(defaultValue != null); |
+ optionalParameterDefaultValues.add(defaultValue); |
+ } |
+ index++; |
}); |
} |
return optionalParameterDefaultValues; |
@@ -945,11 +943,10 @@ class ProgramBuilder { |
var /* List | Map */ optionalParameterDefaultValues; |
if (canBeApplied || canBeReflected) { |
// TODO(redemption): Handle function entities. |
- MethodElement method = element; |
- FunctionSignature signature = method.functionSignature; |
- requiredParameterCount = signature.requiredParameterCount; |
- optionalParameterDefaultValues = |
- _computeParameterDefaultValues(signature); |
+ FunctionEntity method = element; |
+ ParameterStructure parameterStructure = method.parameterStructure; |
+ requiredParameterCount = parameterStructure.requiredParameters; |
+ optionalParameterDefaultValues = _computeParameterDefaultValues(method); |
} |
return new InstanceMethod(element, name, code, |
@@ -995,7 +992,7 @@ class ProgramBuilder { |
/// Stub methods may have an element that can be used for code-size |
/// attribution. |
Method _buildStubMethod(js.Name name, js.Expression code, |
- {MemberElement element}) { |
+ {MemberEntity element}) { |
return new StubMethod(name, code, element: element); |
} |
@@ -1085,8 +1082,15 @@ class ProgramBuilder { |
needsCheckedSetter)); |
} |
- FieldVisitor visitor = new FieldVisitor(_options, _elementEnvironment, |
- _worldBuilder, _nativeData, _mirrorsData, _namer, _closedWorld); |
+ FieldVisitor visitor = new FieldVisitor( |
+ _options, |
+ _elementEnvironment, |
+ _commonElements, |
+ _worldBuilder, |
+ _nativeData, |
+ _mirrorsData, |
+ _namer, |
+ _closedWorld); |
visitor.visitFields(visitField, |
visitStatics: visitStatics, library: library, cls: cls); |
@@ -1152,11 +1156,10 @@ class ProgramBuilder { |
var /* List | Map */ optionalParameterDefaultValues; |
if (canBeApplied || canBeReflected) { |
// TODO(redemption): Support entities; |
- MethodElement method = element; |
- FunctionSignature signature = method.functionSignature; |
- requiredParameterCount = signature.requiredParameterCount; |
- optionalParameterDefaultValues = |
- _computeParameterDefaultValues(signature); |
+ FunctionEntity method = element; |
+ ParameterStructure parameterStructure = method.parameterStructure; |
+ requiredParameterCount = parameterStructure.requiredParameters; |
+ optionalParameterDefaultValues = _computeParameterDefaultValues(method); |
} |
// TODO(floitsch): we shouldn't update the registry in the middle of |