Repository: scalameta/scalameta (scala)

Issue:
MatchError on PolyFunction type as a case pattern
### Minimal snippet

```scala
def doStuff =
  ??? match {
    case x2: ([V] => () => Int) => ???
  }
```

### Error message

<details>

```
scala.MatchError: ([V] => () => Int) (of class scala.meta.Type$PolyFunction$TypePolyFunctionImpl)
	at scala.meta.internal.parsers.ScalametaParser$PatternContextSensitive.loop$2(ScalametaParser.scala:1901)
	at scala.meta.internal.parsers.ScalametaParser$PatternContextSensitive.patternTyp(ScalametaParser.scala:1980)
	at scala.meta.internal.parsers.ScalametaParser$PatternContextSensitive.patternTyp$(ScalametaParser.scala:1900)
	at scala.meta.internal.parsers.ScalametaParser$noSeq$.patternTyp(ScalametaParser.scala:3608)
	at scala.meta.internal.parsers.ScalametaParser$SeqContextSensitive.$anonfun$pattern1$1(ScalametaParser.scala:3421)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser$SeqContextSensitive.pattern1(ScalametaParser.scala:3404)
	at scala.meta.internal.parsers.ScalametaParser$SeqContextSensitive.pattern1$(ScalametaParser.scala:3404)
	at scala.meta.internal.parsers.ScalametaParser$noSeq$.pattern1(ScalametaParser.scala:3608)
	at scala.meta.internal.parsers.ScalametaParser$SeqContextSensitive.pattern(ScalametaParser.scala:3368)
	at scala.meta.internal.parsers.ScalametaParser$SeqContextSensitive.pattern$(ScalametaParser.scala:3362)
	at scala.meta.internal.parsers.ScalametaParser$noSeq$.pattern(ScalametaParser.scala:3608)
	at scala.meta.internal.parsers.ScalametaParser.pattern(ScalametaParser.scala:3631)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$caseClause$1(ScalametaParser.scala:3223)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.caseClause(ScalametaParser.scala:3221)
	at scala.meta.internal.parsers.ScalametaParser.caseClauses(ScalametaParser.scala:3264)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$blockExpr$4(ScalametaParser.scala:3201)
	at scala.meta.internal.parsers.ScalametaParser.inBraces(ScalametaParser.scala:800)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$blockExpr$1(ScalametaParser.scala:3201)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.blockExpr(ScalametaParser.scala:3199)
	at scala.meta.internal.parsers.ScalametaParser.argumentExprsWithUsing(ScalametaParser.scala:3173)
	at scala.meta.internal.parsers.ScalametaParser.argumentExprs(ScalametaParser.scala:3190)
	at scala.meta.internal.parsers.ScalametaParser.argumentExprsOrPrefixExpr(ScalametaParser.scala:3153)
	at scala.meta.internal.parsers.ScalametaParser.loop$5(ScalametaParser.scala:2923)
	at scala.meta.internal.parsers.ScalametaParser.postfixExpr(ScalametaParser.scala:2953)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$expr$12(ScalametaParser.scala:2514)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$expr$2(ScalametaParser.scala:2514)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.expr(ScalametaParser.scala:2397)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$blockStatSeq$2(ScalametaParser.scala:5196)
	at scala.meta.internal.parsers.ScalametaParser.stat(ScalametaParser.scala:5038)
	at scala.meta.internal.parsers.ScalametaParser.blockStatSeq(ScalametaParser.scala:5196)
	at scala.meta.internal.parsers.ScalametaParser.blockWithStats$1(ScalametaParser.scala:3208)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$block$3(ScalametaParser.scala:3214)
	at scala.meta.internal.parsers.ScalametaParser.indented(ScalametaParser.scala:815)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$block$1(ScalametaParser.scala:3214)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.block(ScalametaParser.scala:3207)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$blockExpr$1(ScalametaParser.scala:3204)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.blockExpr(ScalametaParser.scala:3199)
	at scala.meta.internal.parsers.ScalametaParser.exprMaybeIndented(ScalametaParser.scala:2300)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$funDefRest$1(ScalametaParser.scala:4479)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.funDefRest(ScalametaParser.scala:4416)
	at scala.meta.internal.parsers.ScalametaParser.funDefOrDclOrExtensionOrSecondaryCtor(ScalametaParser.scala:4350)
	at scala.meta.internal.parsers.ScalametaParser.defOrDclOrSecondaryCtor(ScalametaParser.scala:4187)
	at scala.meta.internal.parsers.ScalametaParser.nonLocalDefOrDcl(ScalametaParser.scala:4172)
	at scala.meta.internal.parsers.ScalametaParser$$anonfun$templateStat$1$1.applyOrElse(ScalametaParser.scala:5120)
	at scala.meta.internal.parsers.ScalametaParser$$anonfun$templateStat$1$1.applyOrElse(ScalametaParser.scala:5114)
	at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
	at scala.meta.internal.parsers.ScalametaParser.statSeq(ScalametaParser.scala:5057)
	at scala.meta.internal.parsers.ScalametaParser.templateStats(ScalametaParser.scala:5130)
	at scala.meta.internal.parsers.ScalametaParser.templateStatSeq(ScalametaParser.scala:5110)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$templateBody$1(ScalametaParser.scala:4945)
	at scala.meta.internal.parsers.ScalametaParser.inBraces(ScalametaParser.scala:800)
	at scala.meta.internal.parsers.ScalametaParser.templateBody(ScalametaParser.scala:4945)
	at scala.meta.internal.parsers.ScalametaParser.templateBodyOpt(ScalametaParser.scala:4953)
	at scala.meta.internal.parsers.ScalametaParser.template(ScalametaParser.scala:4887)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$template$1(ScalametaParser.scala:4906)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.template(ScalametaParser.scala:4891)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$templateOpt$1(ScalametaParser.scala:4931)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.templateOpt(ScalametaParser.scala:4923)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$objectDef$1(ScalametaParser.scala:4682)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.objectDef(ScalametaParser.scala:4674)
	at scala.meta.internal.parsers.ScalametaParser.tmplDef(ScalametaParser.scala:4558)
	at scala.meta.internal.parsers.ScalametaParser.topLevelTmplDef(ScalametaParser.scala:4540)
	at scala.meta.internal.parsers.ScalametaParser$$anonfun$topStat$1.applyOrElse(ScalametaParser.scala:5079)
	at scala.meta.internal.parsers.ScalametaParser$$anonfun$topStat$1.applyOrElse(ScalametaParser.scala:5067)
	at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
	at scala.meta.internal.parsers.ScalametaParser.statSeq(ScalametaParser.scala:5057)
	at scala.meta.internal.parsers.ScalametaParser.topStatSeq(ScalametaParser.scala:5066)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$batchSource$1(ScalametaParser.scala:5297)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.batchSource(ScalametaParser.scala:5256)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$source$1(ScalametaParser.scala:5239)
	at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
	at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
	at scala.meta.internal.parsers.ScalametaParser.source(ScalametaParser.scala:5238)
	at scala.meta.internal.parsers.ScalametaParser.entrypointSource(ScalametaParser.scala:5244)
	at scala.meta.internal.parsers.ScalametaParser.$anonfun$parseSource$2(ScalametaParser.scala:143)
	at scala.meta.internal.parsers.ScalametaParser.parseRule(ScalametaParser.scala:53)
	at scala.meta.internal.parsers.ScalametaParser.parseSource(ScalametaParser.scala:143)
	at scala.meta.parsers.Parse$.$anonfun$parseSource$1(Parse.scala:29)
	at scala.meta.internal.parsers.ScalametaParser$$anon$264.apply(ScalametaParser.scala:5308)
	at scala.meta.parsers.Api$XtensionParseDialectInput.parse(Api.scala:25)
	at scala.meta.parsers.Api$XtensionParseInputLike.parse(Api.scala:14)
```

</details>

### Scastie snippet

https://scastie.scala-lang.org/KacperFKorban/nLeKlnJKRoW2m6v2DzrHzw/8

Pull request:
Fixes #2506

Patch:
diff --git a/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScalametaParser.scala b/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScalametaParser.scala
index 180b02efe8..aba45618c4 100644
--- a/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScalametaParser.scala
+++ b/scalameta/parsers/shared/src/main/scala/scala/meta/internal/parsers/ScalametaParser.scala
@@ -1934,6 +1934,9 @@ class ScalametaParser(input: Input)(implicit dialect: Dialect) { parser =>
           val params1 = params.map(p => loop(p, convertTypevars = true))
           val res1 = loop(res, convertTypevars = false)
           atPos(tpe, tpe)(Type.Function(params1, res1))
+        case Type.PolyFunction(tparams, res) =>
+          val res1 = loop(res, convertTypevars = false)
+          atPos(tpe, tpe)(Type.PolyFunction(tparams, res1))
         case Type.Tuple(elements) =>
           val elements1 = elements.map(el => loop(el, convertTypevars = true))
           atPos(tpe, tpe)(Type.Tuple(elements1))


Test patch:
diff --git a/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/MinorDottySuite.scala b/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/MinorDottySuite.scala
index 2295b83d6e..7f8c851914 100644
--- a/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/MinorDottySuite.scala
+++ b/tests/shared/src/test/scala/scala/meta/tests/parsers/dotty/MinorDottySuite.scala
@@ -1161,4 +1161,31 @@ class MinorDottySuite extends BaseDottySuite {
     )
   }
 
+  test("issue-2506") {
+    runTestAssert[Stat](
+      """|??? match {
+         |  case x2: ([V] => () => Int) => ???
+         |}
+         |""".stripMargin
+    )(
+      Term.Match(
+        Term.Name("???"),
+        List(
+          Case(
+            Pat.Typed(
+              Pat.Var(Term.Name("x2")),
+              Type.PolyFunction(
+                List(Type.Param(Nil, Type.Name("V"), Nil, Type.Bounds(None, None), Nil, Nil)),
+                Type.Function(Nil, Type.Name("Int"))
+              )
+            ),
+            None,
+            Term.Name("???")
+          )
+        ),
+        Nil
+      )
+    )
+  }
+
 }