diff --git a/build.gradle.kts b/build.gradle.kts index d2551d1..c370aad 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -358,6 +358,7 @@ idea { ".gradle", "gradle", "spike", + ".history" ) } } \ No newline at end of file diff --git a/core/src/main/scala-2.13.7+/latest/splain/SplainFormattingExtension.scala b/core/src/main/scala-2.13.7+/latest/splain/SplainFormattingExtension.scala index c4f7036..3e81db6 100644 --- a/core/src/main/scala-2.13.7+/latest/splain/SplainFormattingExtension.scala +++ b/core/src/main/scala-2.13.7+/latest/splain/SplainFormattingExtension.scala @@ -395,9 +395,17 @@ trait SplainFormattingExtension extends typechecker.splain.SplainFormatting with if (isAux(tpe)) tpe else { - - val result = tpe.dealias - result + val result = tpe.dealias.normalize + result match { + case p: PolyType => + val target = dealias(p.resultType) + val _p = p.copy( + resultType = target + ) + _p + case _ => + result + } } } @@ -608,11 +616,11 @@ trait SplainFormattingExtension extends typechecker.splain.SplainFormatting with protected def formatDiffImplNoDisambiguation(found: Type, req: Type, top: Boolean): Formatted = { - val (left, right) = dealias(found) -> dealias(req) + val reduced = Seq(found, req).map(dealias) + val Seq(left, right) = reduced - val normalized = Seq(left, right).map(_.normalize).distinct - if (normalized.size == 1) { - val only = normalized.head + if (reduced.distinct.size == 1) { + val only = reduced.head val result = formatType(only, top) val basedOn = Seq(found, req).distinct diff --git a/core/src/main/scala-2.13.7+/latest/splain/TyperCompatViews.scala b/core/src/main/scala-2.13.7+/latest/splain/TyperCompatViews.scala index ab50655..cc7705f 100644 --- a/core/src/main/scala-2.13.7+/latest/splain/TyperCompatViews.scala +++ b/core/src/main/scala-2.13.7+/latest/splain/TyperCompatViews.scala @@ -9,11 +9,9 @@ trait TyperCompatViews { case class TypeView(self: Type) { - lazy val extractArgs: List[global.Type] = self match { - // PolyType handling is removed for being unsound - case t: AliasTypeRef if !isAux(self) => - t.betaReduce.typeArgs.map(a => if (a.typeSymbolDirect.isTypeParameter) WildcardType else a) - case _ => self.typeArgs + lazy val extractArgs: List[global.Type] = { + + self.typeArgs } lazy val noArgType: Type = if (extractArgs.nonEmpty) { diff --git a/core/src/test/resources/splain/builtin/BasicSpec/__direct/check b/core/src/test/resources/splain/builtin/BasicSpec/__direct/check index 3227543..8935e74 100644 --- a/core/src/test/resources/splain/builtin/BasicSpec/__direct/check +++ b/core/src/test/resources/splain/builtin/BasicSpec/__direct/check @@ -143,14 +143,7 @@ f invalid because implicitly[String] ^ newSource1.scala:11: error: implicit error; -!I e: - DeepHole.C1[ - DeepHole.T3[ - DeepHole.T1[List[String], ?], - DeepHole.T2[DeepHole.Id, DeepHole.C4, ?], - ? - ] - ] +!I e: DeepHole.C1[[Z]DeepHole.C2[DeepHole.T1,DeepHole.T2,Z]] implicitly[C1[T3]] ^ newSource1.scala:9: error: implicit error; diff --git a/core/src/test/resources/splain/plugin/VTypeDetailReductionSpec/__direct/check b/core/src/test/resources/splain/plugin/VTypeDetailReductionSpec/__direct/check index 5d9ac76..e83b701 100644 --- a/core/src/test/resources/splain/plugin/VTypeDetailReductionSpec/__direct/check +++ b/core/src/test/resources/splain/plugin/VTypeDetailReductionSpec/__direct/check @@ -10,7 +10,7 @@ val x: vecInt.Head = ??? : Option[String] ^ newSource1.scala:8: error: implicit error; !I e: - Option[Int] (reduced from) { FoundReqVsImplicit.vecInt.Head[Int] } =:= + Option[Int] (reduced from) { FoundReqVsImplicit.vecInt.Head } =:= Option[String] Cannot prove that FoundReqVsImplicit.vecInt.Head =:= Option[String]. @@ -19,6 +19,6 @@ implicitly[vecInt.Head =:= Option[String]] newSource1.scala:10: error: type mismatch; Option[String|Int] ――(right side reduced from) - FoundReqVsImplicit.vecInt.Head[Int] + FoundReqVsImplicit.vecInt.Head val x: vecInt.Head = ??? : Option[String] ^ \ No newline at end of file diff --git a/core/src/test/resources/splain/plugin/VTypeDetailSpec/__direct/check b/core/src/test/resources/splain/plugin/VTypeDetailSpec/__direct/check index b5d49ff..0956114 100644 --- a/core/src/test/resources/splain/plugin/VTypeDetailSpec/__direct/check +++ b/core/src/test/resources/splain/plugin/VTypeDetailSpec/__direct/check @@ -76,3 +76,21 @@ newSource1.scala:16: error: implicit error; ――(defined at newSource1.scala:8:13) wrongf(new A) ^ +newSource1.scala:5: error: implicit error; +!I e: String :: Int :: Boolean + implicitly[K] + ^ +newSource1.scala:7: error: type mismatch; + String("abc")|String :: Int :: Boolean + def v: K = "abc" + ^ +newSource1.scala:5: error: implicit error; +!I e: String :: Int :: Boolean (reduced from) { Test.K } + implicitly[K] + ^ +newSource1.scala:7: error: type mismatch; + String("abc")|String :: Int :: Boolean + ――(right side reduced from) + Test.K + def v: K = "abc" + ^ diff --git a/core/src/test/scala/splain/plugin/VTypeDetailSpec.scala b/core/src/test/scala/splain/plugin/VTypeDetailSpec.scala index 03a9d72..47c7aa2 100644 --- a/core/src/test/scala/splain/plugin/VTypeDetailSpec.scala +++ b/core/src/test/scala/splain/plugin/VTypeDetailSpec.scala @@ -25,6 +25,18 @@ class VTypeDetailSpec extends SpecBase.Direct { } """ + final val reduceToInfix = + """ + object Test { + trait ::[A, B] + + type K = String :: Int :: Boolean + implicitly[K] + + def v: K = "abc" + } + """ + describe("#113") { check(wrongContexts, profile = "-P:splain:Vtype-detail:1", numberOfErrors = 2) @@ -40,4 +52,11 @@ class VTypeDetailSpec extends SpecBase.Direct { check(wrongContexts, profile = "-P:splain:Vtype-detail:6", numberOfErrors = 2) } + describe("#119") { + + check(reduceToInfix, profile = "-P:splain:Vtype-detail:3", numberOfErrors = 2) + + check(reduceToInfix, profile = "-P:splain:Vtype-detail:4", numberOfErrors = 2) + } + } diff --git a/testing/acceptance/src/test/resources/splain/builtin/BasicSpec/__direct/check b/testing/acceptance/src/test/resources/splain/builtin/BasicSpec/__direct/check index 96433ce..df600d5 100644 --- a/testing/acceptance/src/test/resources/splain/builtin/BasicSpec/__direct/check +++ b/testing/acceptance/src/test/resources/splain/builtin/BasicSpec/__direct/check @@ -172,15 +172,7 @@ f invalid because newSource1.scala:11: error: implicit error; !I e: splain.acceptance.builtin.StaticBasicSpec.DeepHole.C1[ - splain.acceptance.builtin.StaticBasicSpec.DeepHole.T3[ - splain.acceptance.builtin.StaticBasicSpec.DeepHole.T1[List[String], ?], - splain.acceptance.builtin.StaticBasicSpec.DeepHole.T2[ - splain.acceptance.builtin.StaticBasicSpec.DeepHole.Id, - splain.acceptance.builtin.StaticBasicSpec.DeepHole.C4, - ? - ], - ? - ] + [Z]splain.acceptance.builtin.StaticBasicSpec.DeepHole.C2[splain.acceptance.builtin.StaticBasicSpec.DeepHole.T1,splain.acceptance.builtin.StaticBasicSpec.DeepHole.T2,Z] ] implicitly[C1[T3]] ^