Skip to content

Commit 7f49fae

Browse files
oderskyBlaisorblade
authored andcommitted
Rearrange TypeError exceptions
- Move them all to TypeErrors.scala - Systematically use `toMessage` for reporting - Catch stack overflows instead of counting recursions
1 parent 3899e42 commit 7f49fae

File tree

9 files changed

+14
-96
lines changed

9 files changed

+14
-96
lines changed

compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ class ScalaSettings extends Settings.SettingGroup {
7474
val XmainClass = StringSetting("-Xmain-class", "path", "Class for manifest's Main-Class entry (only useful with -d <jar>)", "")
7575
val XnoValueClasses = BooleanSetting("-Xno-value-classes", "Do not use value classes. Helps debugging.")
7676
val XreplLineWidth = IntSetting("-Xrepl-line-width", "Maximal number of columns per line for REPL output", 390)
77-
val XmaxMemberRecursions = IntSetting("-Xmax-member-recursions", "Maximal number of recursive calls to find-member", 100)
7877
val XfatalWarnings = BooleanSetting("-Xfatal-warnings", "Fail the compilation if there are any warnings.")
7978
val XverifySignatures = BooleanSetting("-Xverify-signatures", "Verify generic signatures in generated bytecode.")
8079

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

Lines changed: 3 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import util.Positions.{Position, NoPosition}
2020
import util.Stats._
2121
import util.{DotClass, SimpleIdentitySet}
2222
import reporting.diagnostic.Message
23-
import reporting.diagnostic.messages.CyclicReferenceInvolving
2423
import ast.tpd._
2524
import ast.TreeTypeMap
2625
import printing.Texts._
@@ -32,10 +31,9 @@ import Uniques._
3231
import collection.{mutable, Seq}
3332
import config.Config
3433
import annotation.tailrec
35-
import Flags.FlagSet
3634
import language.implicitConversions
3735
import scala.util.hashing.{ MurmurHash3 => hashing }
38-
import config.Printers.{core, typr, cyclicErrors}
36+
import config.Printers.{core, typr}
3937
import java.lang.ref.WeakReference
4038

4139
object Types {
@@ -651,17 +649,14 @@ object Types {
651649
}
652650

653651
val recCount = ctx.findMemberCount
654-
if (recCount >= Config.LogPendingFindMemberThreshold) {
655-
if (ctx.findMemberCount > ctx.settings.XmaxMemberRecursions.value)
656-
throw new CyclicFindMember(pre, name)
652+
if (recCount >= Config.LogPendingFindMemberThreshold)
657653
ctx.pendingMemberSearches = name :: ctx.pendingMemberSearches
658-
}
659654
ctx.findMemberCount = recCount + 1
660655
try go(this)
661656
catch {
662657
case ex: Throwable =>
663658
core.println(s"findMember exception for $this member $name, pre = $pre, recCount = $recCount")
664-
throw ex // DEBUG
659+
throw new RecursionOverflow("find-member", pre, name, ex)
665660
}
666661
finally {
667662
if (recCount >= Config.LogPendingFindMemberThreshold)
@@ -4548,56 +4543,6 @@ object Types {
45484543
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean = true
45494544
}
45504545

4551-
// ----- Exceptions -------------------------------------------------------------
4552-
4553-
class TypeError(msg: String) extends Exception(msg)
4554-
4555-
class MalformedType(pre: Type, denot: Denotation, absMembers: Set[Name])
4556-
extends TypeError(
4557-
s"malformed type: $pre is not a legal prefix for $denot because it contains abstract type member${if (absMembers.size == 1) "" else "s"} ${absMembers.mkString(", ")}")
4558-
4559-
class MissingType(pre: Type, name: Name)(implicit ctx: Context) extends TypeError(
4560-
i"""cannot resolve reference to type $pre.$name
4561-
|the classfile defining the type might be missing from the classpath${otherReason(pre)}""") {
4562-
if (ctx.debug) printStackTrace()
4563-
}
4564-
4565-
def showPrefixSafely(pre: Type)(implicit ctx: Context): String = pre.stripTypeVar match {
4566-
case pre: TermRef => i"${pre.termSymbol.name}."
4567-
case pre: TypeRef => i"${pre.typeSymbol.name}#"
4568-
case pre: TypeProxy => showPrefixSafely(pre.underlying)
4569-
case _ => if (pre.typeSymbol.exists) i"${pre.typeSymbol.name}#" else "."
4570-
}
4571-
4572-
class CyclicFindMember(pre: Type, name: Name)(implicit ctx: Context) extends TypeError(
4573-
i"""member search for ${showPrefixSafely(pre)}$name too deep.
4574-
|searches, from inner to outer: .${ctx.pendingMemberSearches}% .%""")
4575-
4576-
private def otherReason(pre: Type)(implicit ctx: Context): String = pre match {
4577-
case pre: ThisType if pre.cls.givenSelfType.exists =>
4578-
i"\nor the self type of $pre might not contain all transitive dependencies"
4579-
case _ => ""
4580-
}
4581-
4582-
class CyclicReference private (val denot: SymDenotation)
4583-
extends TypeError(s"cyclic reference involving $denot") {
4584-
def toMessage(implicit ctx: Context) = CyclicReferenceInvolving(denot)
4585-
}
4586-
4587-
object CyclicReference {
4588-
def apply(denot: SymDenotation)(implicit ctx: Context): CyclicReference = {
4589-
val ex = new CyclicReference(denot)
4590-
if (!(ctx.mode is Mode.CheckCyclic)) {
4591-
cyclicErrors.println(ex.getMessage)
4592-
for (elem <- ex.getStackTrace take 200)
4593-
cyclicErrors.println(elem.toString)
4594-
}
4595-
ex
4596-
}
4597-
}
4598-
4599-
class MergeError(msg: String, val tp1: Type, val tp2: Type) extends TypeError(msg)
4600-
46014546
// ----- Debug ---------------------------------------------------------
46024547

46034548
@sharable var debugTrace = false

compiler/src/dotty/tools/dotc/sbt/ExtractAPI.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import Symbols._
1414
import NameOps._
1515
import NameKinds.DefaultGetterName
1616
import typer.Inliner
17-
import typer.ErrorReporting.cyclicErrorMsg
1817
import transform.ValueClasses
1918
import transform.SymUtils._
2019
import dotty.tools.io.File
@@ -243,10 +242,10 @@ private class ExtractAPICollector(implicit val ctx: Context) extends ThunkHolder
243242
val ancestorTypes0 =
244243
try linearizedAncestorTypes(cinfo)
245244
catch {
246-
case ex: CyclicReference =>
245+
case ex: TypeError =>
247246
// See neg/i1750a for an example where a cyclic error can arise.
248247
// The root cause in this example is an illegal "override" of an inner trait
249-
ctx.error(cyclicErrorMsg(ex), csym.pos)
248+
ctx.error(ex.toMessage, csym.pos)
250249
defn.ObjectType :: Nil
251250
}
252251
if (ValueClasses.isDerivedValueClass(csym)) {

compiler/src/dotty/tools/dotc/transform/OverridingPairs.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import Flags._, Symbols._, Contexts._, Types._, Scopes._, Decorators._
66
import util.HashSet
77
import collection.mutable
88
import collection.immutable.BitSet
9-
import typer.ErrorReporting.cyclicErrorMsg
109
import scala.annotation.tailrec
1110

1211
/** A module that can produce a kind of iterator (`Cursor`),
@@ -133,10 +132,10 @@ object OverridingPairs {
133132
}
134133
}
135134
catch {
136-
case ex: CyclicReference =>
135+
case ex: TypeError =>
137136
// See neg/i1750a for an example where a cyclic error can arise.
138137
// The root cause in this example is an illegal "override" of an inner trait
139-
ctx.error(cyclicErrorMsg(ex), base.pos)
138+
ctx.error(ex.toMessage, base.pos)
140139
}
141140
} else {
142141
curEntry = curEntry.prev

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -341,18 +341,15 @@ object Checking {
341341
val mbr = joint.member(name)
342342
mbr.info match {
343343
case bounds: TypeBounds =>
344-
val res = checkNonCyclic(mbr.symbol, bounds, reportErrors = true).isError
345-
if (res)
346-
println(i"cyclic ${mbr.symbol}, $bounds -> $res")
347-
res
344+
!checkNonCyclic(mbr.symbol, bounds, reportErrors = true).isError
348345
case _ =>
349-
false
346+
true
350347
}
351348
}
352349
catch {
353-
case ex: CyclicFindMember =>
350+
case ex: RecursionOverflow =>
354351
ctx.error(em"cyclic reference involving type $name", pos)
355-
true
352+
false
356353
}
357354
}
358355

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

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,6 @@ object ErrorReporting {
2323
ErrorType(msg)
2424
}
2525

26-
def cyclicErrorMsg(ex: CyclicReference)(implicit ctx: Context) = {
27-
val cycleSym = ex.denot.symbol
28-
def errorMsg(msg: Message, cx: Context): Message =
29-
if (cx.mode is Mode.InferringReturnType) {
30-
cx.tree match {
31-
case tree: untpd.DefDef if !tree.tpt.typeOpt.exists =>
32-
OverloadedOrRecursiveMethodNeedsResultType(tree.name)
33-
case tree: untpd.ValDef if !tree.tpt.typeOpt.exists =>
34-
RecursiveValueNeedsResultType(tree.name)
35-
case _ =>
36-
errorMsg(msg, cx.outer)
37-
}
38-
} else msg
39-
40-
if (cycleSym.is(Implicit, butNot = Method) && cycleSym.owner.isTerm)
41-
CyclicReferenceInvolvingImplicit(cycleSym)
42-
else
43-
errorMsg(ex.toMessage, ctx)
44-
}
45-
4626
def wrongNumberOfTypeArgs(fntpe: Type, expectedArgs: List[ParamInfo], actual: List[untpd.Tree], pos: Position)(implicit ctx: Context) =
4727
errorType(WrongNumberOfTypeArgs(fntpe, expectedArgs, actual)(ctx), pos)
4828

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1614,7 +1614,7 @@ class RefChecks extends MiniPhase { thisPhase =>
16141614
} catch {
16151615
case ex: TypeError =>
16161616
if (settings.debug) ex.printStackTrace()
1617-
unit.error(tree.pos, ex.getMessage())
1617+
unit.error(tree.pos, ex.toMssage)
16181618
tree
16191619
} finally {
16201620
localTyper = savedLocalTyper

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,8 +1857,7 @@ class Typer extends Namer
18571857
assertPositioned(tree)
18581858
try adapt(typedUnadapted(tree, pt, locked), pt, locked)
18591859
catch {
1860-
case ex: CyclicReference => errorTree(tree, cyclicErrorMsg(ex))
1861-
case ex: TypeError => errorTree(tree, ex.getMessage)
1860+
case ex: TypeError => errorTree(tree, ex.toMessage)
18621861
}
18631862
}
18641863

tests/neg/i4368.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ object Test7 {
110110
object Test8 {
111111
112112
class A {
113-
type T = B#U // error: cyclic
113+
type T = B#U
114114
}
115115
116116
class B {

0 commit comments

Comments
 (0)