diff --git a/mtags/src/main/scala-3/scala/meta/internal/pc/completions/MatchCaseCompletions.scala b/mtags/src/main/scala-3/scala/meta/internal/pc/completions/MatchCaseCompletions.scala index 0d701c94cc2..1b349b57f09 100644 --- a/mtags/src/main/scala-3/scala/meta/internal/pc/completions/MatchCaseCompletions.scala +++ b/mtags/src/main/scala-3/scala/meta/internal/pc/completions/MatchCaseCompletions.scala @@ -39,7 +39,6 @@ object CaseKeywordCompletion: * @param selector `selector` of `selector match { cases }` or `EmptyTree` when * not in a match expression (for example `List(1).foreach { case@@ }`. * @param completionPos the position of the completion - * @param typedtree typed tree of the file, used for generating auto imports * @param indexedContext * @param config * @param parent the parent tree node of the pattern match, for example `Apply(_, _)` when in @@ -88,7 +87,7 @@ object CaseKeywordCompletion: new Parents(NoType, definitions) case sel => new Parents(sel.tpe, definitions) - val selectorSym = parents.selector.typeSymbol + val selectorSym = parents.selector.widen.metalsDealias.typeSymbol // Special handle case when selector is a tuple or `FunctionN`. if definitions.isTupleClass(selectorSym) || definitions.isFunctionClass( @@ -151,7 +150,9 @@ object CaseKeywordCompletion: if isValid(ts) then visit(autoImportsGen.inferSymbolImport(ts)) ) // Step 2: walk through known subclasses of sealed types. - val sealedDescs = subclassesForType(parents.selector.widen.bounds.hi) + val sealedDescs = subclassesForType( + parents.selector.widen.metalsDealias.bounds.hi + ) sealedDescs.foreach { sym => val symbolImport = autoImportsGen.inferSymbolImport(sym) visit(symbolImport) @@ -239,7 +240,7 @@ object CaseKeywordCompletion: completionPos, clientSupportsSnippets, ) - val tpe = selector.tpe.widen.bounds.hi match + val tpe = selector.tpe.widen.metalsDealias.bounds.hi match case tr @ TypeRef(_, _) => tr.underlying case t => t diff --git a/tests/cross/src/test/scala/tests/pc/CompletionCaseSuite.scala b/tests/cross/src/test/scala/tests/pc/CompletionCaseSuite.scala index be33b8027ea..43c32b3cab0 100644 --- a/tests/cross/src/test/scala/tests/pc/CompletionCaseSuite.scala +++ b/tests/cross/src/test/scala/tests/pc/CompletionCaseSuite.scala @@ -693,4 +693,51 @@ class CompletionCaseSuite extends BaseCompletionSuite { |case Sports(time, intensity) => exhaustive-enum-tags3.Activity""".stripMargin, ) + check( + "type-alias-case".tag(IgnoreScala2), + s"""|object O: + | type Id[A] = A + | + | enum Animal: + | case Cat, Dog + | + | val animal: Id[Animal] = ??? + | + | animal match + | cas@@ + |""".stripMargin, + """|case Animal.Cat => + |case Animal.Dog => + |""".stripMargin, + ) + + check( + "type-alias-sealed-trait-case", + s"""|object O { + | type Id[A] = A + | + |sealed trait Animal + |object Animal { + | case class Cat() extends Animal + | case object Dog extends Animal + |} + | + | val animal: Id[Animal] = ??? + | + | animal match { + | cas@@ + | } + |} + |""".stripMargin, + """|case Cat() => `type-alias-sealed-trait-case`.O.Animal + |case Dog => `type-alias-sealed-trait-case`.O.Animal + |""".stripMargin, + compat = Map( + "3" -> + """|case Cat() => type-alias-sealed-trait-case.O.Animal + |case Dog => type-alias-sealed-trait-case.O.Animal + |""".stripMargin + ), + ) + } diff --git a/tests/cross/src/test/scala/tests/pc/CompletionMatchSuite.scala b/tests/cross/src/test/scala/tests/pc/CompletionMatchSuite.scala index be1e3ad46de..229595d8929 100644 --- a/tests/cross/src/test/scala/tests/pc/CompletionMatchSuite.scala +++ b/tests/cross/src/test/scala/tests/pc/CompletionMatchSuite.scala @@ -757,4 +757,96 @@ class CompletionMatchSuite extends BaseCompletionSuite { |""".stripMargin, ) + checkEdit( + "type-alias".tag(IgnoreScala2), + s"""|object O { + | type Id[A] = A + | + | enum Animal: + | case Cat, Dog + | + | val animal: Id[Animal] = ??? + | + | animal ma@@ + |} + |""".stripMargin, + s"""object O { + | type Id[A] = A + | + | enum Animal: + | case Cat, Dog + | + | val animal: Id[Animal] = ??? + | + | animal match + |\tcase Animal.Cat => $$0 + |\tcase Animal.Dog => + | + |} + |""".stripMargin, + filter = _.contains("exhaustive"), + ) + + checkEdit( + "type-alias-sealed-trait", + s"""|object O { + | type Id[A] = A + | + |sealed trait Animal + |object Animal { + | case object Cat extends Animal + | case object Dog extends Animal + |} + | + | val animal: Id[Animal] = ??? + | + |animal ma@@ + |} + |""".stripMargin, + s""" + |import O.Animal.Cat + |import O.Animal.Dog + |object O { + | type Id[A] = A + | + |sealed trait Animal + |object Animal { + | case object Cat extends Animal + | case object Dog extends Animal + |} + | + | val animal: Id[Animal] = ??? + | + |animal match { + |\tcase Cat => $$0 + |\tcase Dog => + |} + |} + |""".stripMargin, + compat = Map( + "3" -> + s""" + |import O.Animal.Cat + |import O.Animal.Dog + |object O { + | type Id[A] = A + | + |sealed trait Animal + |object Animal { + | case object Cat extends Animal + | case object Dog extends Animal + |} + | + | val animal: Id[Animal] = ??? + | + |animal match + |\tcase Cat => $$0 + |\tcase Dog => + | + |} + |""".stripMargin + ), + filter = _.contains("exhaustive"), + ) + }