Skip to content

Commit 7b64eb5

Browse files
committed
Set Extension flag for collective extension instances
1 parent b7dd41b commit 7b64eb5

File tree

5 files changed

+11
-10
lines changed

5 files changed

+11
-10
lines changed

compiler/src/dotty/tools/dotc/core/Flags.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ object Flags {
301301
/** A method that has default params */
302302
val (_, DefaultParameterized @ _, _) = newFlags(27, "<defaultparam>")
303303

304-
/** An extension method */
304+
/** An extension method, or a collective extension instance */
305305
val (_, Extension @ _, _) = newFlags(28, "<extension>")
306306

307307
/** An inferable (`given`) parameter */
@@ -506,7 +506,7 @@ object Flags {
506506
val RetainedModuleClassFlags: FlagSet = RetainedModuleValAndClassFlags | Enum
507507

508508
/** Flags retained in export forwarders */
509-
val RetainedExportFlags = Given | Implicit | Extension | Inline
509+
val RetainedExportFlags = Given | Implicit | Inline
510510

511511
/** Flags that apply only to classes */
512512
val ClassOnlyFlags = Sealed | Open | Abstract.toTypeFlags

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3542,21 +3542,21 @@ object Parsers {
35423542
in.nextToken()
35433543
val name = if isIdent && !isIdent(nme.on) then ident() else EmptyTermName
35443544
in.endMarkerScope(if name.isEmpty then nme.extension else name) {
3545-
val (tparams, vparamss) =
3545+
val (tparams, vparamss, extensionFlag) =
35463546
if isIdent(nme.on) then
35473547
in.nextToken()
35483548
val tparams = typeParamClauseOpt(ParamOwner.Def)
35493549
val extParams = paramClause(0, prefix = true)
35503550
val givenParamss = paramClauses(givenOnly = true)
3551-
(tparams, extParams :: givenParamss)
3551+
(tparams, extParams :: givenParamss, Extension)
35523552
else
3553-
(Nil, Nil)
3553+
(Nil, Nil, EmptyFlags)
35543554
possibleTemplateStart()
35553555
if !in.isNestedStart then syntaxError("Extension without extension methods")
35563556
val templ = templateBodyOpt(makeConstructor(tparams, vparamss), Nil, Nil)
35573557
templ.body.foreach(checkExtensionMethod(tparams, vparamss, _))
35583558
val edef = ModuleDef(name, templ)
3559-
finalizeDef(edef, addFlag(mods, Given), start)
3559+
finalizeDef(edef, addFlag(mods, Given | extensionFlag), start)
35603560
}
35613561

35623562
/* -------- TEMPLATES ------------------------------------------- */

compiler/src/dotty/tools/dotc/typer/ImportSuggestions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ trait ImportSuggestions:
202202
.alternatives
203203
.map(mbr => TermRef(site, mbr.symbol))
204204
.filter(ref =>
205-
ref.symbol.is(Extension)
205+
ref.symbol.isAllOf(ExtensionMethod)
206206
&& isApplicableMethodRef(ref, argType :: Nil, WildcardType))
207207
.headOption
208208

compiler/src/dotty/tools/dotc/typer/Namer.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1095,7 +1095,8 @@ class Namer { typer: Typer =>
10951095
(StableRealizable, ExprType(path.tpe.select(sym)))
10961096
else
10971097
(EmptyFlags, mbr.info.ensureMethodic)
1098-
val mbrFlags = Exported | Method | Final | maybeStable | sym.flags & RetainedExportFlags
1098+
var mbrFlags = Exported | Method | Final | maybeStable | sym.flags & RetainedExportFlags
1099+
if sym.isAllOf(ExtensionMethod) then mbrFlags |= Extension
10991100
ctx.newSymbol(cls, alias, mbrFlags, mbrInfo, coord = span)
11001101
}
11011102
forwarder.info = avoidPrivateLeaks(forwarder)

compiler/src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,9 @@ object RefChecks {
392392
overrideError("is erased, cannot override non-erased member")
393393
else if (other.is(Erased) && !member.isOneOf(Erased | Inline)) // (1.9.1)
394394
overrideError("is not erased, cannot override erased member")
395-
else if (member.is(Extension) && !other.is(Extension)) // (1.9.2)
395+
else if (member.isAllOf(ExtensionMethod) && !other.isAllOf(ExtensionMethod)) // (1.9.2)
396396
overrideError("is an extension method, cannot override a normal method")
397-
else if (other.is(Extension) && !member.is(Extension)) // (1.9.2)
397+
else if (other.isAllOf(ExtensionMethod) && !member.isAllOf(ExtensionMethod)) // (1.9.2)
398398
overrideError("is a normal method, cannot override an extension method")
399399
else if ((member.isInlineMethod || member.isScala2Macro) && other.is(Deferred) &&
400400
member.extendedOverriddenSymbols.forall(_.is(Deferred))) // (1.10)

0 commit comments

Comments
 (0)