Support package directive for types
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user