Skip to content

Commit b0a96bf

Browse files
fishythefishCommit Queue
authored and
Commit Queue
committed
[dart2js] Clean up handling of missing super methods.
Issue: #47406 Issue: #48820 Change-Id: I19de399c4670f9866cffceae3bc3ce19201d1ed3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/352963 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Mayank Patke <[email protected]>
1 parent 3722837 commit b0a96bf

File tree

9 files changed

+52
-249
lines changed

9 files changed

+52
-249
lines changed

pkg/compiler/lib/src/inferrer/builder.dart

Lines changed: 10 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -243,16 +243,6 @@ class KernelTypeGraphBuilder extends ir.VisitorDefault<TypeInformation?>
243243
return visit(_analyzedNode)!;
244244
}
245245

246-
bool isIncompatibleInvoke(FunctionEntity function, ArgumentsTypes arguments) {
247-
ParameterStructure parameterStructure = function.parameterStructure;
248-
249-
return arguments.positional.length <
250-
parameterStructure.requiredPositionalParameters ||
251-
arguments.positional.length > parameterStructure.positionalParameters ||
252-
arguments.named.keys
253-
.any((name) => !parameterStructure.namedParameters.contains(name));
254-
}
255-
256246
void recordReturnType(TypeInformation type) {
257247
final analyzedMethod = _analyzedMember as FunctionEntity;
258248
_returnType = _inferrer.addReturnTypeForMethod(analyzedMethod, type);
@@ -940,10 +930,6 @@ class KernelTypeGraphBuilder extends ir.VisitorDefault<TypeInformation?>
940930
ClosureRepresentationInfo info =
941931
_closureDataLookup.getClosureInfo(function);
942932
final callMethod = info.callMethod!;
943-
if (isIncompatibleInvoke(callMethod, argumentsTypes)) {
944-
return _types.dynamicType;
945-
}
946-
947933
TypeInformation type =
948934
handleStaticInvoke(node, selector, callMethod, argumentsTypes);
949935
FunctionType functionType =
@@ -2153,15 +2139,6 @@ class KernelTypeGraphBuilder extends ir.VisitorDefault<TypeInformation?>
21532139
return _types.nonNullEmpty();
21542140
}
21552141

2156-
TypeInformation handleSuperNoSuchMethod(
2157-
ir.Node node, Selector selector, ArgumentsTypes? arguments) {
2158-
// Ensure we create a node, to make explicit the call to the
2159-
// `noSuchMethod` handler.
2160-
FunctionEntity noSuchMethod =
2161-
_elementMap.getSuperNoSuchMethod(_analyzedMember.enclosingClass!);
2162-
return handleStaticInvoke(node, selector, noSuchMethod, arguments);
2163-
}
2164-
21652142
@override
21662143
TypeInformation visitSuperPropertyGet(ir.SuperPropertyGet node) {
21672144
// TODO(herhut): We could do better here if we knew what we
@@ -2170,13 +2147,6 @@ class KernelTypeGraphBuilder extends ir.VisitorDefault<TypeInformation?>
21702147

21712148
final target = getEffectiveSuperTarget(node.interfaceTarget);
21722149
Selector selector = Selector.getter(_elementMap.getName(node.name));
2173-
if (target == null) {
2174-
// TODO(johnniwinther): Remove this when the CFE checks for missing
2175-
// concrete super targets.
2176-
// TODO(48820): If this path is infeasible, update types on
2177-
// getEffectiveSuperTarget.
2178-
return handleSuperNoSuchMethod(node, selector, null);
2179-
}
21802150
MemberEntity member = _elementMap.getMember(target);
21812151
TypeInformation type = handleStaticInvoke(node, selector, member, null);
21822152
if (member.isGetter) {
@@ -2208,11 +2178,6 @@ class KernelTypeGraphBuilder extends ir.VisitorDefault<TypeInformation?>
22082178
final target = getEffectiveSuperTarget(node.interfaceTarget);
22092179
Selector selector = Selector.setter(_elementMap.getName(node.name));
22102180
ArgumentsTypes arguments = ArgumentsTypes([rhsType], null);
2211-
if (target == null) {
2212-
// TODO(johnniwinther): Remove this when the CFE checks for missing
2213-
// concrete super targets.
2214-
return handleSuperNoSuchMethod(node, selector, arguments);
2215-
}
22162181
final member = _elementMap.getMember(target);
22172182
handleStaticInvoke(node, selector, member, arguments);
22182183
return rhsType;
@@ -2227,27 +2192,19 @@ class KernelTypeGraphBuilder extends ir.VisitorDefault<TypeInformation?>
22272192
final target = getEffectiveSuperTarget(node.interfaceTarget);
22282193
ArgumentsTypes arguments = analyzeArguments(node.arguments);
22292194
Selector selector = _elementMap.getSelector(node);
2230-
if (target == null) {
2231-
// TODO(johnniwinther): Remove this when the CFE checks for missing
2232-
// concrete super targets.
2233-
return handleSuperNoSuchMethod(node, selector, arguments);
2234-
}
22352195
MemberEntity member = _elementMap.getMember(target);
22362196
assert(member.isFunction, "Unexpected super invocation target: $member");
2237-
if (isIncompatibleInvoke(member as FunctionEntity, arguments)) {
2238-
return handleSuperNoSuchMethod(node, selector, arguments);
2239-
} else {
2240-
TypeInformation type =
2241-
handleStaticInvoke(node, selector, member, arguments);
2242-
FunctionType functionType =
2243-
_elementMap.elementEnvironment.getFunctionType(member);
2244-
if (functionType.returnType.containsFreeTypeVariables) {
2245-
// The return type varies with the call site so we narrow the static
2246-
// return type.
2247-
type = _types.narrowType(type, _getStaticType(node));
2248-
}
2249-
return type;
2197+
member as FunctionEntity;
2198+
TypeInformation type =
2199+
handleStaticInvoke(node, selector, member, arguments);
2200+
FunctionType functionType =
2201+
_elementMap.elementEnvironment.getFunctionType(member);
2202+
if (functionType.returnType.containsFreeTypeVariables) {
2203+
// The return type varies with the call site so we narrow the static
2204+
// return type.
2205+
type = _types.narrowType(type, _getStaticType(node));
22502206
}
2207+
return type;
22512208
}
22522209

22532210
@override

pkg/compiler/lib/src/ir/impact.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,12 @@ abstract class ImpactRegistry {
156156

157157
void registerInstanceSet(ir.DartType receiverType, ir.Member target);
158158

159-
void registerSuperInvocation(ir.Member? target, int positionalArguments,
159+
void registerSuperInvocation(ir.Member target, int positionalArguments,
160160
List<String> namedArguments, List<ir.DartType> typeArguments);
161161

162-
void registerSuperGet(ir.Member? target);
162+
void registerSuperGet(ir.Member target);
163163

164-
void registerSuperSet(ir.Member? target);
164+
void registerSuperSet(ir.Member target);
165165

166166
void registerSuperInitializer(
167167
ir.Constructor source,

pkg/compiler/lib/src/ir/impact_data.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ class ImpactBuilder extends ir.RecursiveVisitor implements ImpactRegistry {
679679
@override
680680
void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
681681
registerSuperInvocation(
682-
getEffectiveSuperTarget(node.interfaceTarget)!,
682+
getEffectiveSuperTarget(node.interfaceTarget),
683683
node.arguments.positional.length,
684684
_getNamedArguments(node.arguments),
685685
node.arguments.types);
@@ -688,12 +688,12 @@ class ImpactBuilder extends ir.RecursiveVisitor implements ImpactRegistry {
688688

689689
@override
690690
void visitSuperPropertyGet(ir.SuperPropertyGet node) {
691-
registerSuperGet(getEffectiveSuperTarget(node.interfaceTarget)!);
691+
registerSuperGet(getEffectiveSuperTarget(node.interfaceTarget));
692692
}
693693

694694
@override
695695
void visitSuperPropertySet(ir.SuperPropertySet node) {
696-
registerSuperSet(getEffectiveSuperTarget(node.interfaceTarget)!);
696+
registerSuperSet(getEffectiveSuperTarget(node.interfaceTarget));
697697
node.value.accept(this);
698698
}
699699

@@ -788,19 +788,19 @@ class ImpactBuilder extends ir.RecursiveVisitor implements ImpactRegistry {
788788
}
789789

790790
@override
791-
void registerSuperSet(ir.Member? target) {
792-
(_data._superSets ??= []).add(target!);
791+
void registerSuperSet(ir.Member target) {
792+
(_data._superSets ??= []).add(target);
793793
}
794794

795795
@override
796-
void registerSuperGet(ir.Member? target) {
797-
(_data._superGets ??= []).add(target!);
796+
void registerSuperGet(ir.Member target) {
797+
(_data._superGets ??= []).add(target);
798798
}
799799

800800
@override
801-
void registerSuperInvocation(ir.Member? target, int positionalArguments,
801+
void registerSuperInvocation(ir.Member target, int positionalArguments,
802802
List<String> namedArguments, List<ir.DartType> typeArguments) {
803-
(_data._superInvocations ??= []).add(_SuperInvocation(target!,
803+
(_data._superInvocations ??= []).add(_SuperInvocation(target,
804804
_CallStructure(positionalArguments, namedArguments, typeArguments)));
805805
}
806806

pkg/compiler/lib/src/ir/util.dart

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,10 @@ bool memberEntityIsInWebLibrary(MemberEntity entity) {
315315
///
316316
/// See [ir.ProcedureStubKind.ConcreteMixinStub] for why concrete mixin stubs
317317
/// are inserted in the first place.
318-
ir.Member? getEffectiveSuperTarget(ir.Member? target) {
318+
ir.Member getEffectiveSuperTarget(ir.Member target) {
319319
if (target is ir.Procedure) {
320320
if (target.stubKind == ir.ProcedureStubKind.ConcreteMixinStub) {
321-
return getEffectiveSuperTarget(target.stubTarget);
322-
}
323-
// TODO(johnniwinther): Remove this when the CFE reports an error on
324-
// missing concrete super targets.
325-
if (target.isAbstract) {
326-
return null;
321+
return getEffectiveSuperTarget(target.stubTarget!);
327322
}
328323
}
329324
return target;

pkg/compiler/lib/src/js_backend/backend_impact.dart

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -201,18 +201,6 @@ class BackendImpacts {
201201
],
202202
);
203203

204-
late final BackendImpact superNoSuchMethod = BackendImpact(
205-
staticUses: [
206-
_commonElements.createInvocationMirror,
207-
_commonElements.objectNoSuchMethod!
208-
],
209-
otherImpacts: [
210-
_needsInt('Needed to encode the invocation kind of super.noSuchMethod.'),
211-
_needsList('Needed to encode the arguments of super.noSuchMethod.'),
212-
_needsString('Needed to encode the name of super.noSuchMethod.')
213-
],
214-
);
215-
216204
late final BackendImpact constantMapLiteral = BackendImpact(
217205
instantiatedClasses: [
218206
_commonElements.constantMapClass,
@@ -239,12 +227,6 @@ class BackendImpacts {
239227
return intValues;
240228
}
241229

242-
/// Helper for registering that `List` is needed.
243-
BackendImpact _needsList(String reason) {
244-
// TODO(johnniwinther): Register [reason] for use in dump-info.
245-
return listValues;
246-
}
247-
248230
/// Helper for registering that `String` is needed.
249231
BackendImpact _needsString(String reason) {
250232
// TODO(johnniwinther): Register [reason] for use in dump-info.

pkg/compiler/lib/src/js_model/element_map.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,6 @@ abstract class JsToElementMap {
7878
/// Returns the [ClassEntity] corresponding to the class [node].
7979
ClassEntity getClass(ir.Class node);
8080

81-
/// Returns the `noSuchMethod` [FunctionEntity] call from a
82-
/// `super.noSuchMethod` invocation within [cls].
83-
FunctionEntity getSuperNoSuchMethod(ClassEntity cls);
84-
8581
/// Returns the [Name] corresponding to [name].
8682
Name getName(ir.Name name);
8783

pkg/compiler/lib/src/js_model/element_map_impl.dart

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,30 +1336,6 @@ class JsKernelToElementMap implements JsToElementMap, IrToElementMap {
13361336
return ConstructedConstantValue(_commonElements.requiredSentinelType, {});
13371337
}
13381338

1339-
@override
1340-
FunctionEntity getSuperNoSuchMethod(ClassEntity cls) {
1341-
while (true) {
1342-
ClassEntity? superclass = elementEnvironment.getSuperClass(cls);
1343-
if (superclass == null) break;
1344-
MemberEntity? member = elementEnvironment.lookupLocalClassMember(
1345-
superclass, Names.noSuchMethod_);
1346-
if (member != null && !member.isAbstract) {
1347-
if (member.isFunction) {
1348-
final function = member as FunctionEntity;
1349-
if (function.parameterStructure.positionalParameters >= 1) {
1350-
return function;
1351-
}
1352-
}
1353-
// If [member] is not a valid `noSuchMethod` the target is
1354-
// `Object.superNoSuchMethod`.
1355-
break;
1356-
}
1357-
cls = superclass;
1358-
}
1359-
return elementEnvironment.lookupLocalClassMember(
1360-
commonElements.objectClass, Names.noSuchMethod_)! as FunctionEntity;
1361-
}
1362-
13631339
JTypeVariable createTypeVariable(
13641340
Entity typeDeclaration, String name, int index) {
13651341
return JTypeVariable(typeDeclaration, name, index);

pkg/compiler/lib/src/kernel/kernel_impact.dart

Lines changed: 20 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -474,63 +474,36 @@ class KernelImpactConverter implements ImpactRegistry {
474474
}
475475

476476
@override
477-
void registerSuperInvocation(ir.Member? target, int positionalArguments,
477+
void registerSuperInvocation(ir.Member target, int positionalArguments,
478478
List<String> namedArguments, List<ir.DartType> typeArguments) {
479-
if (target != null) {
480-
FunctionEntity method = elementMap.getMember(target) as FunctionEntity;
481-
List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
482-
impactBuilder.registerStaticUse(StaticUse.superInvoke(
483-
method,
484-
CallStructure(positionalArguments + namedArguments.length,
485-
namedArguments, typeArguments.length),
486-
dartTypeArguments));
487-
} else {
488-
// TODO(johnniwinther): Remove this when the CFE checks for missing
489-
// concrete super targets.
490-
impactBuilder.registerStaticUse(StaticUse.superInvoke(
491-
elementMap.getSuperNoSuchMethod(currentMember.enclosingClass!),
492-
CallStructure.ONE_ARG));
493-
registerBackendImpact(_impacts.superNoSuchMethod);
494-
}
479+
FunctionEntity method = elementMap.getMember(target) as FunctionEntity;
480+
List<DartType>? dartTypeArguments = _getTypeArguments(typeArguments);
481+
impactBuilder.registerStaticUse(StaticUse.superInvoke(
482+
method,
483+
CallStructure(positionalArguments + namedArguments.length,
484+
namedArguments, typeArguments.length),
485+
dartTypeArguments));
495486
}
496487

497488
@override
498-
void registerSuperGet(ir.Member? target) {
499-
if (target != null) {
500-
MemberEntity member = elementMap.getMember(target);
501-
if (member.isFunction) {
502-
impactBuilder.registerStaticUse(
503-
StaticUse.superTearOff(member as FunctionEntity));
504-
} else {
505-
impactBuilder.registerStaticUse(StaticUse.superGet(member));
506-
}
489+
void registerSuperGet(ir.Member target) {
490+
MemberEntity member = elementMap.getMember(target);
491+
if (member.isFunction) {
492+
impactBuilder
493+
.registerStaticUse(StaticUse.superTearOff(member as FunctionEntity));
507494
} else {
508-
// TODO(johnniwinther): Remove this when the CFE checks for missing
509-
// concrete super targets.
510-
impactBuilder.registerStaticUse(StaticUse.superInvoke(
511-
elementMap.getSuperNoSuchMethod(currentMember.enclosingClass!),
512-
CallStructure.ONE_ARG));
513-
registerBackendImpact(_impacts.superNoSuchMethod);
495+
impactBuilder.registerStaticUse(StaticUse.superGet(member));
514496
}
515497
}
516498

517499
@override
518-
void registerSuperSet(ir.Member? target) {
519-
if (target != null) {
520-
MemberEntity member = elementMap.getMember(target);
521-
if (member is FieldEntity) {
522-
impactBuilder.registerStaticUse(StaticUse.superFieldSet(member));
523-
} else {
524-
impactBuilder.registerStaticUse(
525-
StaticUse.superSetterSet(member as FunctionEntity));
526-
}
500+
void registerSuperSet(ir.Member target) {
501+
MemberEntity member = elementMap.getMember(target);
502+
if (member is FieldEntity) {
503+
impactBuilder.registerStaticUse(StaticUse.superFieldSet(member));
527504
} else {
528-
// TODO(johnniwinther): Remove this when the CFE checks for missing
529-
// concrete super targets.
530-
impactBuilder.registerStaticUse(StaticUse.superInvoke(
531-
elementMap.getSuperNoSuchMethod(currentMember.enclosingClass!),
532-
CallStructure.ONE_ARG));
533-
registerBackendImpact(_impacts.superNoSuchMethod);
505+
impactBuilder.registerStaticUse(
506+
StaticUse.superSetterSet(member as FunctionEntity));
534507
}
535508
}
536509

0 commit comments

Comments
 (0)