Skip to content

Commit 9bc3bb2

Browse files
committed
Fix scala#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.
1 parent f3d887f commit 9bc3bb2

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

src/dotty/tools/dotc/transform/FirstTransform.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class FirstTransform extends MiniPhaseTransform with IdentityDenotTransformer wi
124124
normalizeType {
125125
val qual = tree.qualifier
126126
qual.symbol.moduleClass.denot match {
127-
case pkg: PackageClassDenotation if tree.symbol.maybeOwner.isPackageObject =>
127+
case pkg: PackageClassDenotation if !tree.symbol.maybeOwner.is(Package) =>
128128
cpy.Select(tree)(qual select pkg.packageObj.symbol, tree.name)
129129
case _ =>
130130
tree

src/dotty/tools/dotc/typer/TypeAssigner.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,15 @@ trait TypeAssigner {
114114
def ensureAccessible(tpe: Type, superAccess: Boolean, pos: Position)(implicit ctx: Context): Type = {
115115

116116
def tryInsertPackageObj(tpe: NamedType, d: Denotation): Type = {
117-
def tryInsert: Type =
118-
if (!(d.symbol.maybeOwner is Package)) {
119-
val symOwner = d.alternatives.head.symbol.owner
120-
if (symOwner.isPackageObject) tpe.derivedSelect(symOwner.thisType)
121-
else tpe
122-
} else tpe
117+
def tryInsert(pkgClass: SymDenotation): Type = pkgClass match {
118+
case pkgCls: PackageClassDenotation if !(d.symbol.maybeOwner is Package) =>
119+
tpe.derivedSelect(pkgCls.packageObj.valRef)
120+
case _ =>
121+
tpe
122+
}
123123
tpe.prefix match {
124-
case pre: ThisType if pre.cls is Package => tryInsert
125-
case pre: TermRef if pre.symbol is Package => tryInsert
124+
case pre: ThisType if pre.cls is Package => tryInsert(pre.cls)
125+
case pre: TermRef if pre.symbol is Package => tryInsert(pre.symbol.moduleClass)
126126
case _ => tpe
127127
}
128128
}

tests/pos/i239-packageObj.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package p {
2+
class C[A] { def foo: A = ??? }
3+
4+
object `package` extends C[String]
5+
}
6+
7+
object test {
8+
9+
val x: String = p.foo
10+
11+
}

0 commit comments

Comments
 (0)