From 594e8dd17b1b3c7f26a7ee979ecdf43d77a51cb1 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Tue, 9 Aug 2016 13:31:33 +0200 Subject: Fix #1442: add new phase, SelectStatic GenBCode has an implicit assumption that I wasn't aware of: GetStatic should not be emitted against a valid selector. If it is, GenBCode messes up the stack by not pop-ing the selector. Surprisingly, this transformation is perfumed in nsc by flatten. --- src/dotty/tools/dotc/transform/SelectStatic.scala | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/dotty/tools/dotc/transform/SelectStatic.scala (limited to 'src/dotty/tools/dotc/transform') diff --git a/src/dotty/tools/dotc/transform/SelectStatic.scala b/src/dotty/tools/dotc/transform/SelectStatic.scala new file mode 100644 index 000000000..fc79b7cbe --- /dev/null +++ b/src/dotty/tools/dotc/transform/SelectStatic.scala @@ -0,0 +1,37 @@ +package dotty.tools.dotc +package transform + +import dotty.tools.dotc.ast.tpd +import dotty.tools.dotc.core.Contexts.Context +import dotty.tools.dotc.core.DenotTransformers.IdentityDenotTransformer +import dotty.tools.dotc.core.Flags._ +import dotty.tools.dotc.core.Symbols._ +import dotty.tools.dotc.core._ +import dotty.tools.dotc.transform.TreeTransforms._ + +/** Removes selects that would be compiled into GetStatic + * otherwise backend needs to be aware that some qualifiers need to be dropped. + * Similar transformation seems to be performed by flatten in nsc + * + * @author Dmytro Petrashko + */ +class SelectStatic extends MiniPhaseTransform with IdentityDenotTransformer { thisTransform => + import ast.tpd._ + + override def phaseName: String = "selectStatic" + private val isPackage = FlagConjunction(PackageCreationFlags.bits) + + override def transformSelect(tree: tpd.Select)(implicit ctx: Context, info: TransformerInfo): tpd.Tree = { + val sym = tree.symbol + if (!sym.is(isPackage) && !sym.owner.is(isPackage) && + ( + ((sym is Flags.Module) && sym.owner.isStaticOwner) || + (sym is Flags.JavaStatic) || + (sym.owner is Flags.ImplClass) || + sym.hasAnnotation(ctx.definitions.ScalaStaticAnnot) + ) + ) + Block(List(tree.qualifier), ref(sym)) + else tree + } +} -- cgit v1.2.3