Support package directive for types

This commit is contained in:
Stanislav Erokhin
2015-09-15 18:53:03 +03:00
parent ea991de21a
commit 1614de86d2
4 changed files with 246 additions and 3 deletions
@@ -51,7 +51,7 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
scope: LexicalScope,
trace: BindingTrace
): ClassifierDescriptor? {
if (userType.qualifier == null) { // optimization for non-qualified types
if (userType.qualifier == null && !userType.startWithPackage) { // optimization for non-qualified types
return userType.referenceExpression?.let {
val classifier = scope.getClassifier(it.getReferencedNameAsName(), KotlinLookupLocation(it))
storageResult(trace, it, listOfNotNull(classifier), scope.ownerDescriptor)
@@ -65,14 +65,14 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
resolveToPackageOrClass(qualifierPartList, module, trace, scope.ownerDescriptor)
return null
}
assert(qualifierPartList.size() > 1) {
assert(qualifierPartList.size() >= 1) {
"Too short qualifier list for user type $userType : ${qualifierPartList.joinToString()}"
}
val qualifier = resolveToPackageOrClass(
qualifierPartList.subList(0, qualifierPartList.size() - 1), module, trace, scope.ownerDescriptor,
firstPartResolver = {
if (userType.isAbsoluteInRootPackage) {
if (userType.startWithPackage) {
null
}
else {
@@ -91,6 +91,16 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
return classifier
}
private val JetUserType.startWithPackage: Boolean
get() {
var firstPart = this
while (firstPart.qualifier != null) {
firstPart = firstPart.qualifier!!
}
return firstPart.isAbsoluteInRootPackage
}
private fun JetUserType.asQualifierPartList(): Pair<List<QualifierPart>, Boolean> {
var hasError = false
val result = SmartList<QualifierPart>()
@@ -0,0 +1,94 @@
// MODULE: m1
// FILE: a.kt
package a.b
class c {
fun ab_c() {}
}
fun ab_fun() {}
// MODULE: m2
// FILE: b.kt
package a
fun a_fun() {}
class b {
fun a_b() {}
class c {
fun a_bc() {}
}
}
// FILE: b2.kt
class x {
fun top_x() {}
}
// MODULE: m3(m1, m2)
// FILE: c.kt
package some
class a {
class b {
fun _ab() {}
class c {
fun _abc() {}
}
}
fun _a() {}
}
class x {
fun _x() {}
}
fun test(a_b: package.a.b) {
a_b.a_b()
a_b.<!UNRESOLVED_REFERENCE!>_ab<!>()
package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_fun<!>() // todo
val a_b2 = package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>()
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_b2<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_b<!>() // todo
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_b2<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>_ab<!>()
}
fun test2(ab_c: package.a.b.c) {
ab_c.ab_c()
val ab_c2 = package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>c<!>()
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ab_c2<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ab_c<!>()
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ab_c2<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_bc<!>()
}
fun test3(top_x: package.x) {
top_x.top_x()
val top_x2 = package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>x<!>()
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>top_x2<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>top_x<!>() // todo
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>top_x2<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>_x<!>()
}
// FILE: c2.kt
package other
object a {
object b {
fun _ab() {}
}
fun _a() {}
}
fun test(<!UNUSED_PARAMETER!>a<!>: a) {
package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_fun<!>() // todo
package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>_a<!>() // todo
package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>ab_fun<!>() // todo
package.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>_ab<!>() // todo
}
@@ -0,0 +1,133 @@
// -- Module: <m1> --
package
package a {
package a.b {
public fun ab_fun(): kotlin.Unit
public final class c {
public constructor c()
public final fun ab_c(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
// -- Module: <m2> --
package
public final class x {
public constructor x()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final fun top_x(): kotlin.Unit
}
package a {
public fun a_fun(): kotlin.Unit
public final class b {
public constructor b()
public final fun a_b(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final class c {
public constructor c()
public final fun a_bc(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
// -- Module: <m3> --
package
public final class x {
// -- Module: <m2> --
}
package a {
public fun a_fun(): kotlin.Unit
public final class b {
// -- Module: <m2> --
}
package a.b {
public fun ab_fun(): kotlin.Unit
public final class c {
// -- Module: <m1> --
}
}
}
package other {
public fun test(/*0*/ a: other.a): kotlin.Unit
public object a {
private constructor a()
public final fun _a(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public object b {
private constructor b()
public final fun _ab(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
package some {
public fun test(/*0*/ a_b: a.b): kotlin.Unit
public fun test2(/*0*/ ab_c: a.b.c): kotlin.Unit
public fun test3(/*0*/ top_x: x): kotlin.Unit
public final class a {
public constructor a()
public final fun _a(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final class b {
public constructor b()
public final fun _ab(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final class c {
public constructor c()
public final fun _abc(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
public final class x {
public constructor x()
public final fun _x(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -11037,6 +11037,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("PackageKeyword.kt")
public void testPackageKeyword() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/PackageKeyword.kt");
doTest(fileName);
}
@TestMetadata("PackageVsClass.kt")
public void testPackageVsClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/PackageVsClass.kt");