Skip to content

Commit fbb00e5

Browse files
kallentuCommit Queue
authored andcommitted
[cfe] Use findStaticMember instead of findInstanceMember for dot shorthands.
This CL avoids reusing `findInstanceMember` to find a static member for a given context. Implemented a new `findStaticMember` that handles resolving with the dot shorthand context. All existing tests pass. Bug: #59758 Change-Id: I71dfef451100ce77d5bd0d203129adbb281b6859 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/416840 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Kallen Tu <[email protected]>
1 parent 0990e6b commit fbb00e5

File tree

3 files changed

+30
-23
lines changed

3 files changed

+30
-23
lines changed

pkg/front_end/lib/src/type_inference/inference_visitor.dart

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12134,15 +12134,11 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1213412134
cachedContext = cachedContext.typeArgument;
1213512135
}
1213612136

12137-
Member? member = findInterfaceMember(
12138-
cachedContext, node.name, node.fileOffset,
12139-
includeExtensionMethods: false,
12140-
isSetter: false,
12141-
isDotShorthand: true)
12142-
.member;
12137+
Member? member =
12138+
findStaticMember(cachedContext, node.name, node.fileOffset);
1214312139

1214412140
Expression expr;
12145-
if (member is Procedure) {
12141+
if (member is Procedure && member.kind == ProcedureKind.Method) {
1214612142
expr = new StaticInvocation(member, node.arguments)
1214712143
..fileOffset = node.fileOffset;
1214812144
} else if (member == null && cachedContext is TypeDeclarationType) {
@@ -12223,10 +12219,8 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1222312219
cachedContext = cachedContext.typeArgument;
1222412220
}
1222512221

12226-
Member? member = findInterfaceMember(
12227-
cachedContext, node.name, node.fileOffset,
12228-
isSetter: false, isDotShorthand: true)
12229-
.member;
12222+
Member? member =
12223+
findStaticMember(cachedContext, node.name, node.fileOffset);
1223012224

1223112225
ExpressionInferenceResult expressionInferenceResult;
1223212226
if (member == null) {

pkg/front_end/lib/src/type_inference/inference_visitor_base.dart

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,8 +1149,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
11491149

11501150
/// Finds a constructor of [type] called [name].
11511151
Member? findConstructor(TypeDeclarationType type, Name name, int fileOffset) {
1152-
assert(isKnown(type));
1153-
11541152
// TODO(Dart Model team): Seems like an abstraction level issue to require
11551153
// going from `Class` objects back to builders to find a `Member`.
11561154
DeclarationBuilder builder;
@@ -1184,8 +1182,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
11841182
DartType receiverType, Name name, int fileOffset,
11851183
{required bool isSetter,
11861184
bool instrumented = true,
1187-
bool includeExtensionMethods = false,
1188-
bool isDotShorthand = false}) {
1185+
bool includeExtensionMethods = false}) {
11891186
assert(isKnown(receiverType));
11901187

11911188
DartType receiverBound = receiverType.nonTypeParameterBound;
@@ -1204,7 +1201,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
12041201
classNode: classNode,
12051202
receiverBound: receiverBound,
12061203
hasNonObjectMemberAccess: hasNonObjectMemberAccess,
1207-
isDotShorthand: isDotShorthand,
12081204
isSetter: isSetter,
12091205
fileOffset: fileOffset);
12101206

@@ -1268,6 +1264,22 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
12681264
return target;
12691265
}
12701266

1267+
/// Finds a static member of [type] called [name].
1268+
Member? findStaticMember(DartType type, Name name, int fileOffset) {
1269+
if (type is! TypeDeclarationType) return null;
1270+
switch (type) {
1271+
case InterfaceType():
1272+
return _getStaticMember(type.classNode, name, false);
1273+
case ExtensionType():
1274+
ObjectAccessTarget? target = _findExtensionTypeMember(
1275+
type, type, name, fileOffset,
1276+
isSetter: false,
1277+
hasNonObjectMemberAccess: type.hasNonObjectMemberAccess,
1278+
isDotShorthand: true);
1279+
return target?.member;
1280+
}
1281+
}
1282+
12711283
/// If target is missing on a non-dynamic receiver, an error is reported
12721284
/// using [errorTemplate] and an invalid expression is returned.
12731285
Expression? reportMissingInterfaceMember(
@@ -4639,7 +4651,6 @@ class _ObjectAccessDescriptor {
46394651
final DartType receiverBound;
46404652
final Class classNode;
46414653
final bool hasNonObjectMemberAccess;
4642-
final bool isDotShorthand;
46434654
final bool isSetter;
46444655
final int fileOffset;
46454656

@@ -4649,7 +4660,6 @@ class _ObjectAccessDescriptor {
46494660
required this.receiverBound,
46504661
required this.classNode,
46514662
required this.hasNonObjectMemberAccess,
4652-
required this.isDotShorthand,
46534663
required this.isSetter,
46544664
required this.fileOffset});
46554665

@@ -4734,17 +4744,15 @@ class _ObjectAccessDescriptor {
47344744
ObjectAccessTarget? target = visitor._findExtensionTypeMember(
47354745
receiverType, receiverBound, name, fileOffset,
47364746
isSetter: isSetter,
4737-
hasNonObjectMemberAccess: hasNonObjectMemberAccess,
4738-
isDotShorthand: isDotShorthand);
4747+
hasNonObjectMemberAccess: hasNonObjectMemberAccess);
47394748
if (target != null) {
47404749
return target;
47414750
}
47424751
}
47434752

47444753
ObjectAccessTarget? target;
4745-
Member? interfaceMember = isDotShorthand
4746-
? visitor._getStaticMember(classNode, name, false)
4747-
: visitor._getInterfaceMember(classNode, name, isSetter);
4754+
Member? interfaceMember =
4755+
visitor._getInterfaceMember(classNode, name, isSetter);
47484756
if (interfaceMember != null) {
47494757
target = new ObjectAccessTarget.interfaceMember(
47504758
receiverType, interfaceMember,

tests/language/dot_shorthands/simple/simple_identifier_error_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,9 @@ void main() {
2929
// ^
3030
// [analyzer] unspecified
3131
// [cfe] unspecified
32+
33+
Integer i = .one();
34+
// ^
35+
// [analyzer] unspecified
36+
// [cfe] unspecified
3237
}

0 commit comments

Comments
 (0)