@@ -50,6 +50,7 @@ import '../ordered_typeset.dart';
50
50
import '../serialization/serialization.dart' ;
51
51
import '../ssa/type_builder.dart' ;
52
52
import '../universe/call_structure.dart' ;
53
+ import '../universe/member_usage.dart' ;
53
54
import '../universe/selector.dart' ;
54
55
55
56
import 'closure.dart' ;
@@ -144,8 +145,11 @@ class JsKernelToElementMap
144
145
145
146
Map <IndexedClass , List <IndexedMember >> _injectedClassMembers = {};
146
147
147
- JsKernelToElementMap (this .reporter, Environment environment,
148
- KernelToElementMapImpl _elementMap, Iterable <MemberEntity > liveMembers)
148
+ JsKernelToElementMap (
149
+ this .reporter,
150
+ Environment environment,
151
+ KernelToElementMapImpl _elementMap,
152
+ Map <MemberEntity , MemberUsage > liveMemberUsage)
149
153
: this .options = _elementMap.options {
150
154
_elementEnvironment = new JsElementEnvironment (this );
151
155
_commonElements = new CommonElementsImpl (_elementEnvironment);
@@ -161,7 +165,7 @@ class JsKernelToElementMap
161
165
KLibraryEnv oldEnv = _elementMap.libraries.getEnv (oldLibrary);
162
166
KLibraryData data = _elementMap.libraries.getData (oldLibrary);
163
167
IndexedLibrary newLibrary = convertLibrary (oldLibrary);
164
- JLibraryEnv newEnv = oldEnv.convert (_elementMap, liveMembers );
168
+ JLibraryEnv newEnv = oldEnv.convert (_elementMap, liveMemberUsage );
165
169
libraryMap[oldEnv.library] =
166
170
libraries.register <IndexedLibrary , JLibraryData , JLibraryEnv >(
167
171
newLibrary, data.convert (), newEnv);
@@ -178,7 +182,7 @@ class JsKernelToElementMap
178
182
IndexedLibrary oldLibrary = oldClass.library;
179
183
LibraryEntity newLibrary = libraries.getEntity (oldLibrary.libraryIndex);
180
184
IndexedClass newClass = convertClass (newLibrary, oldClass);
181
- JClassEnv newEnv = env.convert (_elementMap, liveMembers );
185
+ JClassEnv newEnv = env.convert (_elementMap, liveMemberUsage );
182
186
classMap[env.cls] = classes.register (newClass, data.convert (), newEnv);
183
187
assert (newClass.classIndex == oldClass.classIndex);
184
188
libraries.getEnv (newClass.library).registerClass (newClass.name, newEnv);
@@ -206,7 +210,8 @@ class JsKernelToElementMap
206
210
memberIndex < _elementMap.members.length;
207
211
memberIndex++ ) {
208
212
IndexedMember oldMember = _elementMap.members.getEntity (memberIndex);
209
- if (! liveMembers.contains (oldMember)) {
213
+ MemberUsage memberUsage = liveMemberUsage[oldMember];
214
+ if (memberUsage == null ) {
210
215
members.skipIndex (oldMember.memberIndex);
211
216
continue ;
212
217
}
@@ -216,9 +221,14 @@ class JsKernelToElementMap
216
221
LibraryEntity newLibrary = libraries.getEntity (oldLibrary.libraryIndex);
217
222
ClassEntity newClass =
218
223
oldClass != null ? classes.getEntity (oldClass.classIndex) : null ;
219
- IndexedMember newMember = convertMember (newLibrary, newClass, oldMember);
224
+ IndexedMember newMember =
225
+ convertMember (newLibrary, newClass, oldMember, memberUsage);
220
226
members.register (newMember, data.convert ());
221
- assert (newMember.memberIndex == oldMember.memberIndex);
227
+ assert (
228
+ newMember.memberIndex == oldMember.memberIndex,
229
+ "Member index mismatch: "
230
+ "Old member $oldMember has index ${oldMember .memberIndex } "
231
+ "whereas new member $newMember has index ${newMember .memberIndex }" );
222
232
if (newMember.isField) {
223
233
fieldMap[data.node] = newMember;
224
234
} else if (newMember.isConstructor) {
@@ -1120,20 +1130,6 @@ class JsKernelToElementMap
1120
1130
argumentCount, namedArguments, arguments.types.length);
1121
1131
}
1122
1132
1123
- ParameterStructure getParameterStructure (ir.FunctionNode node,
1124
- // TODO(johnniwinther): Remove this when type arguments are passed to
1125
- // constructors like calling a generic method.
1126
- {bool includeTypeParameters: true }) {
1127
- // TODO(johnniwinther): Cache the computed function type.
1128
- int requiredParameters = node.requiredParameterCount;
1129
- int positionalParameters = node.positionalParameters.length;
1130
- int typeParameters = node.typeParameters.length;
1131
- List <String > namedParameters =
1132
- node.namedParameters.map ((p) => p.name).toList ()..sort ();
1133
- return new ParameterStructure (requiredParameters, positionalParameters,
1134
- namedParameters, includeTypeParameters ? typeParameters : 0 );
1135
- }
1136
-
1137
1133
Selector getSelector (ir.Expression node) {
1138
1134
// TODO(efortuna): This is screaming for a common interface between
1139
1135
// PropertyGet and SuperPropertyGet (and same for *Get). Talk to kernel
@@ -1480,8 +1476,9 @@ class JsKernelToElementMap
1480
1476
isFromEnvironmentConstructor: isFromEnvironmentConstructor);
1481
1477
}
1482
1478
1483
- JConstructorBody createConstructorBody (ConstructorEntity constructor) {
1484
- return new JConstructorBody (constructor);
1479
+ JConstructorBody createConstructorBody (
1480
+ ConstructorEntity constructor, ParameterStructure parameterStructure) {
1481
+ return new JConstructorBody (constructor, parameterStructure);
1485
1482
}
1486
1483
1487
1484
JGeneratorBody createGeneratorBody (
@@ -1536,8 +1533,8 @@ class JsKernelToElementMap
1536
1533
return createTypedef (library, typedef .name);
1537
1534
}
1538
1535
1539
- MemberEntity convertMember (
1540
- LibraryEntity library, ClassEntity cls, IndexedMember member ) {
1536
+ MemberEntity convertMember (LibraryEntity library, ClassEntity cls,
1537
+ IndexedMember member, MemberUsage memberUsage ) {
1541
1538
Name memberName = new Name (member.memberName.text, library,
1542
1539
isSetter: member.memberName.isSetter);
1543
1540
if (member.isField) {
@@ -1551,14 +1548,14 @@ class JsKernelToElementMap
1551
1548
if (constructor.isFactoryConstructor) {
1552
1549
// TODO(redemption): This should be a JFunction.
1553
1550
return createFactoryConstructor (
1554
- cls, memberName, constructor.parameterStructure ,
1551
+ cls, memberName, memberUsage.invokedParameters ,
1555
1552
isExternal: constructor.isExternal,
1556
1553
isConst: constructor.isConst,
1557
1554
isFromEnvironmentConstructor:
1558
1555
constructor.isFromEnvironmentConstructor);
1559
1556
} else {
1560
1557
return createGenerativeConstructor (
1561
- cls, memberName, constructor.parameterStructure ,
1558
+ cls, memberName, memberUsage.invokedParameters ,
1562
1559
isExternal: constructor.isExternal, isConst: constructor.isConst);
1563
1560
}
1564
1561
} else if (member.isGetter) {
@@ -1575,8 +1572,8 @@ class JsKernelToElementMap
1575
1572
isAbstract: setter.isAbstract);
1576
1573
} else {
1577
1574
IndexedFunction function = member;
1578
- return createMethod (library, cls, memberName, function.parameterStructure,
1579
- function.asyncMarker,
1575
+ return createMethod (library, cls, memberName,
1576
+ memberUsage.invokedParameters, function.asyncMarker,
1580
1577
isStatic: function.isStatic,
1581
1578
isExternal: function.isExternal,
1582
1579
isAbstract: function.isAbstract);
@@ -1696,7 +1693,14 @@ class JsKernelToElementMap
1696
1693
ir.Constructor node, covariant IndexedConstructor constructor) {
1697
1694
JConstructorDataImpl data = members.getData (constructor);
1698
1695
if (data.constructorBody == null ) {
1699
- JConstructorBody constructorBody = createConstructorBody (constructor);
1696
+ /// The constructor calls the constructor body with all parameters.
1697
+ // TODO(johnniwinther): Remove parameters that are not used in the
1698
+ // constructor body.
1699
+ ParameterStructure parameterStructure =
1700
+ _getParameterStructureFromFunctionNode (node.function);
1701
+
1702
+ JConstructorBody constructorBody =
1703
+ createConstructorBody (constructor, parameterStructure);
1700
1704
members.register <IndexedFunction , FunctionData >(
1701
1705
constructorBody,
1702
1706
new ConstructorBodyDataImpl (
@@ -1748,7 +1752,8 @@ class JsKernelToElementMap
1748
1752
void f (DartType type, String name, ConstantValue defaultValue),
1749
1753
{bool isNative: false }) {
1750
1754
FunctionData data = members.getData (function);
1751
- data.forEachParameter (this , f, isNative: isNative);
1755
+ data.forEachParameter (this , function.parameterStructure, f,
1756
+ isNative: isNative);
1752
1757
}
1753
1758
1754
1759
void forEachConstructorBody (
@@ -1820,6 +1825,17 @@ class JsKernelToElementMap
1820
1825
Local local, Map <Local , JRecordField > recordFieldsVisibleInScope) =>
1821
1826
recordFieldsVisibleInScope.containsKey (local);
1822
1827
1828
+ ParameterStructure _getParameterStructureFromFunctionNode (
1829
+ ir.FunctionNode node) {
1830
+ int requiredParameters = node.requiredParameterCount;
1831
+ int positionalParameters = node.positionalParameters.length;
1832
+ int typeParameters = node.typeParameters.length;
1833
+ List <String > namedParameters =
1834
+ node.namedParameters.map ((p) => p.name).toList ()..sort ();
1835
+ return new ParameterStructure (requiredParameters, positionalParameters,
1836
+ namedParameters, typeParameters);
1837
+ }
1838
+
1823
1839
KernelClosureClassInfo constructClosureClass (
1824
1840
MemberEntity member,
1825
1841
ir.FunctionNode node,
@@ -1863,8 +1879,8 @@ class JsKernelToElementMap
1863
1879
closureEntity = new AnonymousClosureLocal (classEntity);
1864
1880
}
1865
1881
1866
- IndexedFunction callMethod = new JClosureCallMethod (
1867
- classEntity, getParameterStructure (node), getAsyncMarker (node));
1882
+ IndexedFunction callMethod = new JClosureCallMethod (classEntity,
1883
+ _getParameterStructureFromFunctionNode (node), getAsyncMarker (node));
1868
1884
_nestedClosureMap
1869
1885
.putIfAbsent (member, () => < IndexedFunction > [])
1870
1886
.add (callMethod);
0 commit comments