From a3a91216b9395cd12cc3e96491640f5ebf840d49 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Thu, 15 Jun 2017 13:41:15 +0200 Subject: [PATCH 1/3] Harden TreeAccumulator for IDE --- compiler/src/dotty/tools/dotc/ast/Trees.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/ast/Trees.scala b/compiler/src/dotty/tools/dotc/ast/Trees.scala index f7df30b404c6..74453570678c 100644 --- a/compiler/src/dotty/tools/dotc/ast/Trees.scala +++ b/compiler/src/dotty/tools/dotc/ast/Trees.scala @@ -1305,8 +1305,10 @@ object Trees { this(this(x, arg), annot) case Thicket(ts) => this(x, ts) - case _ if ctx.reporter.errorsReported => + case _ if ctx.mode.is(Mode.Interactive) => // in case of errors it may be that typed trees point to untyped ones. + // The can still traverse inside such trees, either in the run where errors + // are reported, or in subsequent ones. x } } From 23d0a491c445c05e7212c79a2714107e1e9d48d3 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sun, 18 Jun 2017 18:27:17 +0200 Subject: [PATCH 2/3] Avoid another source of stale symbol errors in IDE --- compiler/src/dotty/tools/dotc/core/Types.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/core/Types.scala b/compiler/src/dotty/tools/dotc/core/Types.scala index f8fe33e3e33f..d8c6dd814a8a 100644 --- a/compiler/src/dotty/tools/dotc/core/Types.scala +++ b/compiler/src/dotty/tools/dotc/core/Types.scala @@ -1538,7 +1538,8 @@ object Types { else recomputeMember(d) // symbol could have been overridden, recompute membership else { val newd = loadDenot - if (newd.exists) newd else d.staleSymbolError + if (newd.exists || ctx.mode.is(Mode.Interactive)) newd + else d.staleSymbolError } case d => if (d.validFor.runId != ctx.period.runId) loadDenot From f43af9d74b4c39490a01c6705535b177586ebe70 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Thu, 22 Jun 2017 13:10:44 +0200 Subject: [PATCH 3/3] Address reviewers comments --- compiler/src/dotty/tools/dotc/ast/Trees.scala | 4 ++-- compiler/src/dotty/tools/dotc/core/Types.scala | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/ast/Trees.scala b/compiler/src/dotty/tools/dotc/ast/Trees.scala index 74453570678c..2d120eca16ce 100644 --- a/compiler/src/dotty/tools/dotc/ast/Trees.scala +++ b/compiler/src/dotty/tools/dotc/ast/Trees.scala @@ -1306,8 +1306,8 @@ object Trees { case Thicket(ts) => this(x, ts) case _ if ctx.mode.is(Mode.Interactive) => - // in case of errors it may be that typed trees point to untyped ones. - // The can still traverse inside such trees, either in the run where errors + // In case of errors it may be that typed trees point to untyped ones. + // The IDE can still traverse inside such trees, either in the run where errors // are reported, or in subsequent ones. x } diff --git a/compiler/src/dotty/tools/dotc/core/Types.scala b/compiler/src/dotty/tools/dotc/core/Types.scala index d8c6dd814a8a..cc11bc4f0bd5 100644 --- a/compiler/src/dotty/tools/dotc/core/Types.scala +++ b/compiler/src/dotty/tools/dotc/core/Types.scala @@ -1538,7 +1538,8 @@ object Types { else recomputeMember(d) // symbol could have been overridden, recompute membership else { val newd = loadDenot - if (newd.exists || ctx.mode.is(Mode.Interactive)) newd + if (newd.exists) newd + else if (ctx.mode.is(Mode.Interactive)) d else d.staleSymbolError } case d =>