aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-29 11:30:05 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-29 11:30:05 +0200
commit9a49deff8a1905b9dc111e79638541ea5ba927c9 (patch)
tree6fd3340071ec9c09527fe7635242bc77cda7a167 /src/dotty/tools/dotc/core
parent8b9bdfe5f0c8c084b2db90ddcc0b5bbc25347034 (diff)
downloaddotty-9a49deff8a1905b9dc111e79638541ea5ba927c9.tar.gz
dotty-9a49deff8a1905b9dc111e79638541ea5ba927c9.tar.bz2
dotty-9a49deff8a1905b9dc111e79638541ea5ba927c9.zip
Shorten "if denotation is current the symbol" to "currentSymbol".
And make its usage more systematic on all substitutions where it makes sense.
Diffstat (limited to 'src/dotty/tools/dotc/core')
-rw-r--r--src/dotty/tools/dotc/core/Substituters.scala10
-rw-r--r--src/dotty/tools/dotc/core/Types.scala17
2 files changed, 21 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/core/Substituters.scala b/src/dotty/tools/dotc/core/Substituters.scala
index c67d352a4..a7977dc2b 100644
--- a/src/dotty/tools/dotc/core/Substituters.scala
+++ b/src/dotty/tools/dotc/core/Substituters.scala
@@ -12,7 +12,7 @@ trait Substituters { this: Context =>
case tp: BoundType =>
if (tp.binder eq from) tp.copyBoundType(to.asInstanceOf[tp.BT]) else tp
case tp: NamedType =>
- if (tp.denotationIsCurrent && tp.symbol.isStatic) tp
+ if (tp.currentSymbol.isStatic) tp
else tp.derivedSelect(subst(tp.prefix, from, to, theMap))
case _: ThisType | NoPrefix =>
tp
@@ -166,7 +166,7 @@ trait Substituters { this: Context =>
case tp: ThisType =>
if (tp.cls eq from) to else tp
case tp: NamedType =>
- if (tp.symbol.isStaticOwner) tp
+ if (tp.currentSymbol.isStaticOwner) tp
else tp.derivedSelect(substThis(tp.prefix, from, to, theMap))
case _: BoundType | NoPrefix =>
tp
@@ -184,7 +184,7 @@ trait Substituters { this: Context =>
case tp @ RefinedThis(rt) =>
if (rt eq from) to else tp
case tp: NamedType =>
- if (tp.denotationIsCurrent && tp.symbol.isStatic) tp
+ if (tp.currentSymbol.isStatic) tp
else tp.derivedSelect(substThis(tp.prefix, from, to, theMap))
case _: ThisType | _: BoundType | NoPrefix =>
tp
@@ -202,7 +202,7 @@ trait Substituters { this: Context =>
case tp: BoundType =>
if (tp == from) to else tp
case tp: NamedType =>
- if (tp.symbol.isStatic) tp
+ if (tp.currentSymbol.isStatic) tp
else tp.derivedSelect(substParam(tp.prefix, from, to, theMap))
case _: ThisType | NoPrefix =>
tp
@@ -220,7 +220,7 @@ trait Substituters { this: Context =>
case tp: ParamType =>
if (tp.binder == from) to(tp.paramNum) else tp
case tp: NamedType =>
- if (tp.symbol.isStatic) tp
+ if (tp.currentSymbol.isStatic) tp
else tp.derivedSelect(substParams(tp.prefix, from, to, theMap))
case _: ThisType | NoPrefix | _: RefinedThis =>
tp
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala
index c2d465f7f..42ff62f4d 100644
--- a/src/dotty/tools/dotc/core/Types.scala
+++ b/src/dotty/tools/dotc/core/Types.scala
@@ -1102,9 +1102,24 @@ object Types {
// (1) checkedPeriod != Nowhere => lastDenotation != null
// (2) lastDenotation != null => lastSymbol != null
+ /** There is a denotation computed which is valid (somewhere in) the
+ * current run.
+ */
def denotationIsCurrent(implicit ctx: Context) =
lastDenotation != null && lastDenotation.validFor.runId == ctx.runId
+ /** The the denotation is current, its symbol, otherwise NoDenotation.
+ *
+ * Note: This operation does not force the denotation, and is therefore
+ * timing dependent. It should only be used if the outcome of the
+ * essential computation does not depend on the symbol being present or not.
+ * It's currently used to take an optimized path in substituters and
+ * type accumulators, as well as to be safe in diagnostiic printing.
+ * Normally, it's better to use `symbol`, not `currentSymbol`.
+ */
+ def currentSymbol(implicit ctx: Context) =
+ if (denotationIsCurrent) symbol else NoSymbol
+
/** The denotation currently denoted by this type */
final def denot(implicit ctx: Context): Denotation = {
val now = ctx.period
@@ -2659,7 +2674,7 @@ object Types {
this(x, if (tp1.exists) tp1 else tp.prefix)
}
case tp: TermRef =>
- if (stopAtStatic && tp.denotationIsCurrent && tp.symbol.isStatic) x
+ if (stopAtStatic && tp.currentSymbol.isStatic) x
else this(x, tp.prefix)
case _: ThisType