Skip to content

Commit d4f30d1

Browse files
committed
Keep separate chain of outer reporters for StoreReporters
Used in rewritten `errorsReported` method. This fixes #866. The problem before was that `TyperState#trywithFallBack` temporarily updates the reporter, so crawling up the context chain to check for reporters with errors missed some reported errors, which triggered the assertion in `Tree#withType`.
1 parent 75ac401 commit d4f30d1

File tree

5 files changed

+12
-7
lines changed

5 files changed

+12
-7
lines changed

src/dotty/tools/dotc/Driver.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ abstract class Driver extends DotClass {
1212

1313
protected def newCompiler(): Compiler
1414

15-
protected def emptyReporter: Reporter = new StoreReporter
15+
protected def emptyReporter: Reporter = new StoreReporter(null)
1616

1717
protected def doCompile(compiler: Compiler, fileNames: List[String])(implicit ctx: Context): Reporter =
1818
if (fileNames.nonEmpty)

src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ object Trees {
146146
* type. (Overridden by empty trees)
147147
*/
148148
def withType(tpe: Type)(implicit ctx: Context): ThisTree[Type] = {
149-
if (tpe == ErrorType) assert(ctx.errorsReported)
149+
if (tpe == ErrorType) assert(ctx.reporter.errorsReported)
150150
withTypeUnchecked(tpe)
151151
}
152152

src/dotty/tools/dotc/core/TyperState.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ extends TyperState(r) {
9898

9999

100100
override def fresh(isCommittable: Boolean): TyperState =
101-
new MutableTyperState(this, new StoreReporter, isCommittable)
101+
new MutableTyperState(this, new StoreReporter(reporter), isCommittable)
102102

103103
override def withReporter(reporter: Reporter) =
104104
new MutableTyperState(this, reporter, isCommittable)
@@ -169,7 +169,7 @@ extends TyperState(r) {
169169
* found a better solution.
170170
*/
171171
override def tryWithFallback[T](op: => T)(fallback: => T)(implicit ctx: Context): T = {
172-
val storeReporter = new StoreReporter
172+
val storeReporter = new StoreReporter(myReporter)
173173
val savedReporter = myReporter
174174
myReporter = storeReporter
175175
val savedConstraint = myConstraint

src/dotty/tools/dotc/reporting/Reporter.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,6 @@ trait Reporting { this: Context =>
173173
throw ex
174174
}
175175
}
176-
177-
def errorsReported: Boolean = outersIterator exists (_.reporter.hasErrors)
178176
}
179177

180178
/**
@@ -213,6 +211,11 @@ abstract class Reporter {
213211
def hasErrors = errorCount > 0
214212
def hasWarnings = warningCount > 0
215213

214+
/** Have errors been reported by this reporter, or in the
215+
* case where this is a StoreReporter, by an outer reporter?
216+
*/
217+
def errorsReported = hasErrors
218+
216219
val unreportedWarnings = new mutable.HashMap[String, Int] {
217220
override def default(key: String) = 0
218221
}

src/dotty/tools/dotc/reporting/StoreReporter.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import config.Printers._
1010
/**
1111
* This class implements a Reporter that stores all messages
1212
*/
13-
class StoreReporter extends Reporter {
13+
class StoreReporter(outer: Reporter) extends Reporter {
1414

1515
private var infos: mutable.ListBuffer[Diagnostic] = null
1616

@@ -33,4 +33,6 @@ class StoreReporter extends Reporter {
3333
infos foreach ctx.reporter.report
3434
infos = null
3535
}
36+
37+
override def errorsReported = hasErrors || outer.errorsReported
3638
}

0 commit comments

Comments
 (0)