@@ -1043,8 +1043,8 @@ object RefChecks {
1043
1043
* This check is suppressed if the method is an override. (Because the type of the receiver
1044
1044
* may be narrower in the override.)
1045
1045
*
1046
- * If the extension method is nullary , it is always hidden by a member of the same name.
1047
- * (Either the member is nullary , or the reference is taken as the eta-expansion of the member.)
1046
+ * If the extension method is nilary , it is always hidden by a member of the same name.
1047
+ * (Either the member is nilary , or the reference is taken as the eta-expansion of the member.)
1048
1048
*
1049
1049
* This check is in lieu of a more expensive use-site check that an application failed to use an extension.
1050
1050
* That check would account for accessibility and opacity. As a limitation, this check considers
@@ -1068,25 +1068,29 @@ object RefChecks {
1068
1068
extension (tp : Type )
1069
1069
def explicit = Applications .stripImplicit(tp.stripPoly, wildcardOnly = true )
1070
1070
def hasImplicitParams = tp.stripPoly match { case mt : MethodType => mt.isImplicitMethod case _ => false }
1071
+ def isNilary = tp.stripPoly match { case mt : MethodType => false case _ => true }
1071
1072
val explicitInfo = sym.info.explicit // consider explicit value params
1072
- val target0 = explicitInfo.firstParamTypes.head // required for extension method, the putative receiver
1073
- val target = target0.dealiasKeepOpaques.typeSymbol.info
1074
- val methTp = explicitInfo.resultType // skip leading implicits and the "receiver" parameter
1075
- def memberMatchesMethod ( member : Denotation ) =
1073
+ def memberHidesMethod ( member : Denotation ) : Boolean =
1074
+ val methTp = explicitInfo.resultType // skip leading implicits and the "receiver" parameter
1075
+ if methTp.isNilary then
1076
+ return true // extension without parens is always hidden by a member of same name
1076
1077
val memberIsImplicit = member.info.hasImplicitParams
1077
- val paramTps =
1078
- if memberIsImplicit then methTp.stripPoly.firstParamTypes
1079
- else methTp.explicit.firstParamTypes
1080
1078
inline def paramsCorrespond =
1079
+ val paramTps =
1080
+ if memberIsImplicit then methTp.stripPoly.firstParamTypes
1081
+ else methTp.explicit.firstParamTypes
1081
1082
val memberParamTps = member.info.stripPoly.firstParamTypes
1082
1083
memberParamTps.corresponds(paramTps): (m, x) =>
1083
1084
m.typeSymbol.denot.isOpaqueAlias == x.typeSymbol.denot.isOpaqueAlias && (x frozen_<:< m)
1084
- paramTps.isEmpty || memberIsImplicit && ! methTp.hasImplicitParams || paramsCorrespond
1085
- def hidden =
1086
- target.nonPrivateMember(sym.name)
1087
- .filterWithPredicate: member =>
1088
- member.symbol.isPublic && memberMatchesMethod(member)
1089
- .exists
1085
+ memberIsImplicit && ! methTp.hasImplicitParams || paramsCorrespond
1086
+ def targetOfHiddenExtension : Symbol =
1087
+ val target =
1088
+ val target0 = explicitInfo.firstParamTypes.head // required for extension method, the putative receiver
1089
+ target0.dealiasKeepOpaques.typeSymbol.info
1090
+ val member = target.nonPrivateMember(sym.name)
1091
+ .filterWithPredicate: member =>
1092
+ member.symbol.isPublic && memberHidesMethod(member)
1093
+ if member.exists then target.typeSymbol else NoSymbol
1090
1094
if sym.is(HasDefaultParams ) then
1091
1095
val getterDenot =
1092
1096
val receiverName = explicitInfo.firstParamNames.head
@@ -1095,8 +1099,10 @@ object RefChecks {
1095
1099
sym.owner.info.member(getterName)
1096
1100
if getterDenot.exists
1097
1101
then report.warning(ExtensionHasDefault (sym), getterDenot.symbol.srcPos)
1098
- if ! sym.nextOverriddenSymbol.exists && hidden
1099
- then report.warning(ExtensionNullifiedByMember (sym, target.typeSymbol), sym.srcPos)
1102
+ if ! sym.nextOverriddenSymbol.exists then
1103
+ val target = targetOfHiddenExtension
1104
+ if target.exists then
1105
+ report.warning(ExtensionNullifiedByMember (sym, target), sym.srcPos)
1100
1106
end checkExtensionMethods
1101
1107
1102
1108
/** Verify that references in the user-defined `@implicitNotFound` message are valid.
0 commit comments