@@ -1150,8 +1150,8 @@ object RefChecks {
1150
1150
* This check is suppressed if the method is an override. (Because the type of the receiver
1151
1151
* may be narrower in the override.)
1152
1152
*
1153
- * If the extension method is nullary , it is always hidden by a member of the same name.
1154
- * (Either the member is nullary , or the reference is taken as the eta-expansion of the member.)
1153
+ * If the extension method is nilary , it is always hidden by a member of the same name.
1154
+ * (Either the member is nilary , or the reference is taken as the eta-expansion of the member.)
1155
1155
*
1156
1156
* This check is in lieu of a more expensive use-site check that an application failed to use an extension.
1157
1157
* That check would account for accessibility and opacity. As a limitation, this check considers
@@ -1175,25 +1175,29 @@ object RefChecks {
1175
1175
extension (tp : Type )
1176
1176
def explicit = Applications .stripImplicit(tp.stripPoly, wildcardOnly = true )
1177
1177
def hasImplicitParams = tp.stripPoly match { case mt : MethodType => mt.isImplicitMethod case _ => false }
1178
+ def isNilary = tp.stripPoly match { case mt : MethodType => false case _ => true }
1178
1179
val explicitInfo = sym.info.explicit // consider explicit value params
1179
- val target0 = explicitInfo.firstParamTypes.head // required for extension method, the putative receiver
1180
- val target = target0.dealiasKeepOpaques.typeSymbol.info
1181
- val methTp = explicitInfo.resultType // skip leading implicits and the "receiver" parameter
1182
- def memberMatchesMethod ( member : Denotation ) =
1180
+ def memberHidesMethod ( member : Denotation ) : Boolean =
1181
+ val methTp = explicitInfo.resultType // skip leading implicits and the "receiver" parameter
1182
+ if methTp.isNilary then
1183
+ return true // extension without parens is always hidden by a member of same name
1183
1184
val memberIsImplicit = member.info.hasImplicitParams
1184
- val paramTps =
1185
- if memberIsImplicit then methTp.stripPoly.firstParamTypes
1186
- else methTp.explicit.firstParamTypes
1187
1185
inline def paramsCorrespond =
1186
+ val paramTps =
1187
+ if memberIsImplicit then methTp.stripPoly.firstParamTypes
1188
+ else methTp.explicit.firstParamTypes
1188
1189
val memberParamTps = member.info.stripPoly.firstParamTypes
1189
1190
memberParamTps.corresponds(paramTps): (m, x) =>
1190
1191
m.typeSymbol.denot.isOpaqueAlias == x.typeSymbol.denot.isOpaqueAlias && (x frozen_<:< m)
1191
- paramTps.isEmpty || memberIsImplicit && ! methTp.hasImplicitParams || paramsCorrespond
1192
- def hidden =
1193
- target.nonPrivateMember(sym.name)
1194
- .filterWithPredicate: member =>
1195
- member.symbol.isPublic && memberMatchesMethod(member)
1196
- .exists
1192
+ memberIsImplicit && ! methTp.hasImplicitParams || paramsCorrespond
1193
+ def targetOfHiddenExtension : Symbol =
1194
+ val target =
1195
+ val target0 = explicitInfo.firstParamTypes.head // required for extension method, the putative receiver
1196
+ target0.dealiasKeepOpaques.typeSymbol.info
1197
+ val member = target.nonPrivateMember(sym.name)
1198
+ .filterWithPredicate: member =>
1199
+ member.symbol.isPublic && memberHidesMethod(member)
1200
+ if member.exists then target.typeSymbol else NoSymbol
1197
1201
if sym.is(HasDefaultParams ) then
1198
1202
val getterDenot =
1199
1203
val receiverName = explicitInfo.firstParamNames.head
@@ -1202,8 +1206,10 @@ object RefChecks {
1202
1206
sym.owner.info.member(getterName)
1203
1207
if getterDenot.exists
1204
1208
then report.warning(ExtensionHasDefault (sym), getterDenot.symbol.srcPos)
1205
- if ! sym.nextOverriddenSymbol.exists && hidden
1206
- then report.warning(ExtensionNullifiedByMember (sym, target.typeSymbol), sym.srcPos)
1209
+ if ! sym.nextOverriddenSymbol.exists then
1210
+ val target = targetOfHiddenExtension
1211
+ if target.exists then
1212
+ report.warning(ExtensionNullifiedByMember (sym, target), sym.srcPos)
1207
1213
end checkExtensionMethods
1208
1214
1209
1215
/** Verify that references in the user-defined `@implicitNotFound` message are valid.
0 commit comments