aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-12-13 17:55:55 +0100
committerMartin Odersky <odersky@gmail.com>2014-12-13 18:02:41 +0100
commit9bc3bb2d1fe3348bc7a92e5cb38a7d9f77166a71 (patch)
tree016ef664eed45de398c514f17bb654b85e098d4c /src
parentf3d887f079efbe7dbb53abd22bd212eee8e1c67a (diff)
downloaddotty-9bc3bb2d1fe3348bc7a92e5cb38a7d9f77166a71.tar.gz
dotty-9bc3bb2d1fe3348bc7a92e5cb38a7d9f77166a71.tar.bz2
dotty-9bc3bb2d1fe3348bc7a92e5cb38a7d9f77166a71.zip
Fix #239 - handling of package objects
References to `.package` are now also inserted if the accessed member comes from a class inherited by a package object.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/FirstTransform.scala2
-rw-r--r--src/dotty/tools/dotc/typer/TypeAssigner.scala16
2 files changed, 9 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/transform/FirstTransform.scala b/src/dotty/tools/dotc/transform/FirstTransform.scala
index 42ace148a..3329ac304 100644
--- a/src/dotty/tools/dotc/transform/FirstTransform.scala
+++ b/src/dotty/tools/dotc/transform/FirstTransform.scala
@@ -124,7 +124,7 @@ class FirstTransform extends MiniPhaseTransform with IdentityDenotTransformer wi
normalizeType {
val qual = tree.qualifier
qual.symbol.moduleClass.denot match {
- case pkg: PackageClassDenotation if tree.symbol.maybeOwner.isPackageObject =>
+ case pkg: PackageClassDenotation if !tree.symbol.maybeOwner.is(Package) =>
cpy.Select(tree)(qual select pkg.packageObj.symbol, tree.name)
case _ =>
tree
diff --git a/src/dotty/tools/dotc/typer/TypeAssigner.scala b/src/dotty/tools/dotc/typer/TypeAssigner.scala
index 0f1b81be8..1caa070cc 100644
--- a/src/dotty/tools/dotc/typer/TypeAssigner.scala
+++ b/src/dotty/tools/dotc/typer/TypeAssigner.scala
@@ -114,15 +114,15 @@ trait TypeAssigner {
def ensureAccessible(tpe: Type, superAccess: Boolean, pos: Position)(implicit ctx: Context): Type = {
def tryInsertPackageObj(tpe: NamedType, d: Denotation): Type = {
- def tryInsert: Type =
- if (!(d.symbol.maybeOwner is Package)) {
- val symOwner = d.alternatives.head.symbol.owner
- if (symOwner.isPackageObject) tpe.derivedSelect(symOwner.thisType)
- else tpe
- } else tpe
+ def tryInsert(pkgClass: SymDenotation): Type = pkgClass match {
+ case pkgCls: PackageClassDenotation if !(d.symbol.maybeOwner is Package) =>
+ tpe.derivedSelect(pkgCls.packageObj.valRef)
+ case _ =>
+ tpe
+ }
tpe.prefix match {
- case pre: ThisType if pre.cls is Package => tryInsert
- case pre: TermRef if pre.symbol is Package => tryInsert
+ case pre: ThisType if pre.cls is Package => tryInsert(pre.cls)
+ case pre: TermRef if pre.symbol is Package => tryInsert(pre.symbol.moduleClass)
case _ => tpe
}
}