Skip to content

Commit ba67d09

Browse files
committed
bugfix: highlight for enum type params
1 parent 4b401c9 commit ba67d09

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

mtags/src/main/scala-3/scala/meta/internal/pc/PcCollector.scala

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,33 @@ abstract class PcCollector[T](
112112
end adjust
113113

114114
def symbolAlternatives(sym: Symbol) =
115+
def member(parent: Symbol) = parent.info.member(sym.name).symbol
116+
def primaryConstructorTypeParam(owner: Symbol) =
117+
for
118+
typeParams <- owner.primaryConstructor.paramSymss.headOption
119+
param <- typeParams.find(_.name == sym.name)
120+
if (param.isType)
121+
yield param
122+
def additionalForEnumTypeParam(enumClass: Symbol) =
123+
if enumClass.is(Flags.Enum) then
124+
val enumOwner =
125+
if enumClass.is(Flags.Case)
126+
then
127+
Option.when(member(enumClass).is(Flags.Synthetic))(
128+
enumClass.owner.companionClass
129+
)
130+
else Some(enumClass)
131+
enumOwner.toSet.flatMap { enumOwner =>
132+
val symsInEnumCases = enumOwner.children.toSet.flatMap(enumCase =>
133+
if member(enumCase).is(Flags.Synthetic)
134+
then primaryConstructorTypeParam(enumCase)
135+
else None
136+
)
137+
val symsInEnumOwner =
138+
primaryConstructorTypeParam(enumOwner).toSet + member(enumOwner)
139+
symsInEnumCases ++ symsInEnumOwner
140+
}
141+
else Set.empty
115142
val all =
116143
if sym.is(Flags.ModuleClass) then
117144
Set(sym, sym.companionModule, sym.companionModule.companion)
@@ -130,7 +157,11 @@ abstract class PcCollector[T](
130157
) ++ sym.allOverriddenSymbols.toSet
131158
// type used in primary constructor will not match the one used in the class
132159
else if sym.isTypeParam && sym.owner.isPrimaryConstructor then
133-
Set(sym, sym.owner.owner.info.member(sym.name).symbol)
160+
Set(sym, member(sym.owner.owner))
161+
++ additionalForEnumTypeParam(sym.owner.owner)
162+
else if sym.isTypeParam then
163+
primaryConstructorTypeParam(sym.owner).toSet
164+
++ additionalForEnumTypeParam(sym.owner) + sym
134165
else Set(sym)
135166
all.filter(s => s != NoSymbol && !s.isError)
136167
end symbolAlternatives

tests/cross/src/test/scala/tests/highlight/Scala3DocumentHighlightSuite.scala

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ class Scala3DocumentHighlightSuite extends BaseDocumentHighlightSuite {
248248
)
249249

250250
check(
251-
"enum-cases".tag(IgnoreScala2),
251+
"enum-cases",
252252
"""|enum MyOption:
253253
| case <<My@@Some>>(value: Int)
254254
| case MyNone
@@ -258,7 +258,7 @@ class Scala3DocumentHighlightSuite extends BaseDocumentHighlightSuite {
258258
)
259259

260260
check(
261-
"enum-cases2".tag(IgnoreScala2),
261+
"enum-cases2",
262262
"""|enum MyOption:
263263
| case <<My@@Some>>[U](value: U)
264264
| case MyNone
@@ -267,4 +267,45 @@ class Scala3DocumentHighlightSuite extends BaseDocumentHighlightSuite {
267267
|""".stripMargin,
268268
)
269269

270+
check(
271+
"type-params-in-enum",
272+
"""|enum MyOption[+<<A@@A>>]:
273+
| case MySome(value: <<AA>>)
274+
| case MyNone
275+
|""".stripMargin,
276+
)
277+
278+
check(
279+
"type-params-in-enum2",
280+
"""|enum MyOption[+<<AA>>]:
281+
| case MySome(value: <<A@@A>>)
282+
| case MyNone
283+
|""".stripMargin,
284+
)
285+
286+
check(
287+
"type-params-in-enum3",
288+
"""|enum MyOption[<<AA>>](v: <<AA>>):
289+
| def get: <<A@@A>> = ???
290+
| case MySome[AA](value: AA) extends MyOption[Int](1)
291+
|""".stripMargin,
292+
)
293+
294+
check(
295+
"type-params-in-enum4",
296+
"""|enum MyOption[+<<AA>>]:
297+
| def get: <<A@@A>> = ??
298+
| case MySome(value: <<AA>>)
299+
| case MyNone
300+
|""".stripMargin,
301+
)
302+
303+
check(
304+
"type-params-in-enum5",
305+
"""|enum MyOption[AA]:
306+
| def get: AA = ???
307+
| case MySome[<<AA>>](value: <<A@@A>>) extends MyOption[Int]
308+
|""".stripMargin,
309+
)
310+
270311
}

0 commit comments

Comments
 (0)