Use NewQualifiedExpressionResolver for resolve types

This commit is contained in:
Stanislav Erokhin
2015-09-13 02:01:03 +03:00
parent 8efbf4fc32
commit 69cb3f818d
18 changed files with 701 additions and 351 deletions
@@ -24,9 +24,12 @@ import org.jetbrains.kotlin.incremental.KotlinLookupLocation
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.scopes.JetScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.receivers.QualifierReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.resolve.scopes.utils.getClassifier
import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -43,11 +46,73 @@ public class NewQualifiedExpressionResolver(val symbolUsageValidator: SymbolUsag
}
}
public fun resolveDescriptorForUserType(
userType: JetUserType,
scope: LexicalScope,
trace: BindingTrace
): ClassifierDescriptor? {
if (userType.qualifier == null) { // optimization for non-qualified types
return userType.referenceExpression?.let {
val classifier = scope.getClassifier(it.getReferencedNameAsName(), KotlinLookupLocation(it))
storageResult(trace, it, listOfNotNull(classifier), scope.ownerDescriptor)
classifier
}
}
val module = scope.ownerDescriptor.module
val (qualifierPartList, hasError) = userType.asQualifierPartList()
if (hasError) {
resolveToPackageOrClass(qualifierPartList, module, trace, scope.ownerDescriptor)
return null
}
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) {
null
}
else {
scope.getClassifier(it.name, it.location)
}
}
) ?: return null
val lastPart = qualifierPartList.last()
val classifier = when (qualifier) {
is PackageViewDescriptor -> qualifier.memberScope.getClassifier(lastPart.name, lastPart.location)
is ClassDescriptor -> qualifier.unsubstitutedInnerClassesScope.getClassifier(lastPart.name, lastPart.location)
else -> null
}
storageResult(trace, lastPart.expression, listOfNotNull(classifier), scope.ownerDescriptor)
return classifier
}
private fun JetUserType.asQualifierPartList(): Pair<List<QualifierPart>, Boolean> {
var hasError = false
val result = SmartList<QualifierPart>()
var userType: JetUserType? = this
while (userType != null) {
val referenceExpression = userType.referenceExpression
if (referenceExpression != null) {
result add QualifierPart(referenceExpression.getReferencedNameAsName(), referenceExpression, userType.typeArgumentList)
}
else {
hasError = true
}
userType = userType.qualifier
}
return result.asReversed() to hasError
}
public fun processImportReference(
importDirective: JetImportDirective,
moduleDescriptor: ModuleDescriptor,
trace: BindingTrace,
shouldBeVisibleFrom: DeclarationDescriptor
shouldBeVisibleFrom: DeclarationDescriptor // todo
): JetScope {
val importedReference = importDirective.importedReference ?: return JetScope.Empty
val path = importedReference.asQualifierPartList(trace)
@@ -185,6 +250,7 @@ public class NewQualifiedExpressionResolver(val symbolUsageValidator: SymbolUsag
}
val (currentDescriptor, currentIndex) = firstPartResolver(path.first())?.let {
storageResult(trace, path.first().expression, listOf(it), shouldBeVisibleFrom)
Pair(it, 1)
} ?: moduleDescriptor.quickResolveToPackage(path, trace)
return path.subList(currentIndex, path.size()).fold<QualifierPart, DeclarationDescriptor?>(currentDescriptor) {
@@ -17,26 +17,16 @@
package org.jetbrains.kotlin.resolve;
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.Mutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.diagnostics.Errors;
import org.jetbrains.kotlin.incremental.KotlinLookupLocation;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.scopes.AbstractScopeAdapter;
import org.jetbrains.kotlin.resolve.scopes.JetScope;
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import static org.jetbrains.kotlin.diagnostics.Errors.*;
@@ -74,330 +64,4 @@ public class QualifiedExpressionResolver {
// todo fix shouldBeVisibleFrom
return newQualifiedExpressionResolver.processImportReference(importDirective, moduleDescriptor, trace, moduleDescriptor);
}
@NotNull
public Collection<DeclarationDescriptor> lookupDescriptorsForUserType(
@NotNull JetUserType userType,
@NotNull JetScope outerScope,
@NotNull BindingTrace trace,
boolean onlyClassifiers
) {
if (userType.isAbsoluteInRootPackage()) {
trace.report(Errors.UNSUPPORTED.on(userType, "package"));
return Collections.emptyList();
}
JetSimpleNameExpression referenceExpression = userType.getReferenceExpression();
/*
if (referenceExpression == null) {
return Collections.emptyList();
}
*/
JetUserType qualifier = userType.getQualifier();
// We do not want to resolve the last segment of a user type to a package
JetScope filteredScope = filterOutPackagesIfNeeded(outerScope, onlyClassifiers);
DeclarationDescriptor shouldBeVisibleFrom = outerScope.getContainingDeclaration();
if (qualifier == null) {
if (referenceExpression == null) return Collections.emptyList();
return lookupDescriptorsForSimpleNameReference(referenceExpression, filteredScope, shouldBeVisibleFrom, trace,
LookupMode.ONLY_CLASSES_AND_PACKAGES,
false, true);
}
Collection<DeclarationDescriptor> declarationDescriptors = lookupDescriptorsForUserType(qualifier, outerScope, trace, false);
if (referenceExpression == null) return Collections.emptyList();
return lookupSelectorDescriptors(referenceExpression, declarationDescriptors, trace, shouldBeVisibleFrom,
LookupMode.ONLY_CLASSES_AND_PACKAGES, true);
}
private static JetScope filterOutPackagesIfNeeded(final JetScope outerScope, boolean noPackages) {
return !noPackages ? outerScope : new AbstractScopeAdapter() {
@NotNull
@Override
protected JetScope getWorkerScope() {
return outerScope;
}
@Nullable
@Override
public PackageViewDescriptor getPackage(@NotNull Name name) {
return null;
}
};
}
@NotNull
public Collection<DeclarationDescriptor> lookupSelectorDescriptors(
@NotNull JetSimpleNameExpression selector,
@NotNull Collection<DeclarationDescriptor> declarationDescriptors,
@NotNull BindingTrace trace,
@NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull LookupMode lookupMode,
boolean storeResult
) {
Set<LookupResult> results = Sets.newLinkedHashSet();
for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) {
if (declarationDescriptor instanceof PackageViewDescriptor) {
results.add(lookupSimpleNameReference(selector, ((PackageViewDescriptor) declarationDescriptor).getMemberScope(),
lookupMode, true));
}
if (declarationDescriptor instanceof ClassDescriptor) {
addResultsForClass(results, selector, lookupMode, (ClassDescriptor) declarationDescriptor);
}
}
return filterAndStoreResolutionResult(results, selector, trace, shouldBeVisibleFrom, lookupMode, storeResult);
}
private static void addResultsForClass(
@NotNull @Mutable Set<LookupResult> results,
@NotNull JetSimpleNameExpression selector,
@NotNull LookupMode lookupMode,
@NotNull ClassDescriptor descriptor
) {
JetScope scope = lookupMode == LookupMode.ONLY_CLASSES_AND_PACKAGES
? descriptor.getUnsubstitutedInnerClassesScope()
: descriptor.getDefaultType().getMemberScope();
results.add(lookupSimpleNameReference(selector, scope, lookupMode, false));
results.add(lookupSimpleNameReference(selector, descriptor.getStaticScope(), lookupMode, true));
}
@NotNull
@SuppressWarnings("MethodMayBeStatic")
public Collection<DeclarationDescriptor> lookupDescriptorsForSimpleNameReference(
@NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope outerScope,
@NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull BindingTrace trace,
@NotNull LookupMode lookupMode,
boolean packageLevel,
boolean storeResult
) {
LookupResult lookupResult = lookupSimpleNameReference(referenceExpression, outerScope, lookupMode, packageLevel);
return filterAndStoreResolutionResult(Collections.singletonList(lookupResult), referenceExpression, trace, shouldBeVisibleFrom,
lookupMode, storeResult);
}
@NotNull
private static LookupResult lookupSimpleNameReference(
@NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope outerScope,
@NotNull LookupMode lookupMode,
boolean packageLevel
) {
Name referencedName = referenceExpression.getReferencedNameAsName();
Collection<DeclarationDescriptor> descriptors = Sets.newLinkedHashSet();
PackageViewDescriptor packageDescriptor = outerScope.getPackage(referencedName);
if (packageDescriptor != null) {
descriptors.add(packageDescriptor);
}
KotlinLookupLocation location = new KotlinLookupLocation(referenceExpression);
ClassifierDescriptor classifierDescriptor = outerScope.getClassifier(referencedName, location);
if (classifierDescriptor != null) {
descriptors.add(classifierDescriptor);
}
if (lookupMode == LookupMode.EVERYTHING) {
descriptors.addAll(outerScope.getFunctions(referencedName, location));
descriptors.addAll(outerScope.getProperties(referencedName, location));
VariableDescriptor localVariable = outerScope.getLocalVariable(referencedName);
if (localVariable != null) {
descriptors.add(localVariable);
}
}
return new LookupResult(descriptors, outerScope, packageLevel);
}
@NotNull
private Collection<DeclarationDescriptor> filterAndStoreResolutionResult(
@NotNull Collection<LookupResult> lookupResults,
@NotNull JetSimpleNameExpression referenceExpression,
@NotNull BindingTrace trace,
@NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull LookupMode lookupMode,
boolean storeResult
) {
if (lookupResults.isEmpty()) {
return Collections.emptyList();
}
Collection<DeclarationDescriptor> descriptors = Sets.newLinkedHashSet();
for (LookupResult lookupResult : lookupResults) {
descriptors.addAll(lookupResult.descriptors);
}
Collection<DeclarationDescriptor> filteredDescriptors;
if (lookupMode == LookupMode.ONLY_CLASSES_AND_PACKAGES) {
filteredDescriptors = Collections2.filter(descriptors, CLASSIFIERS_AND_PACKAGE_VIEWS);
}
else {
filteredDescriptors = Sets.newLinkedHashSet();
//functions and properties can be imported if lookupResult.packageLevel == true
for (LookupResult lookupResult : lookupResults) {
if (lookupResult.packageLevel) {
filteredDescriptors.addAll(lookupResult.descriptors);
}
else {
filteredDescriptors.addAll(Collections2.filter(lookupResult.descriptors, CLASSIFIERS_AND_PACKAGE_VIEWS));
}
}
}
if (storeResult) {
Collection<JetScope> possibleResolutionScopes = Lists.newArrayList();
for (LookupResult lookupResult : lookupResults) {
if (!lookupResult.descriptors.isEmpty()) {
possibleResolutionScopes.add(lookupResult.resolutionScope);
}
}
if (possibleResolutionScopes.isEmpty()) {
for (LookupResult lookupResult : lookupResults) {
possibleResolutionScopes.add(lookupResult.resolutionScope);
}
}
storeResolutionResult(descriptors, filteredDescriptors, referenceExpression, possibleResolutionScopes, trace,
shouldBeVisibleFrom);
}
return filteredDescriptors;
}
private void storeResolutionResult(
@NotNull Collection<DeclarationDescriptor> descriptors,
@NotNull Collection<DeclarationDescriptor> canBeImportedDescriptors,
@NotNull JetSimpleNameExpression referenceExpression,
@NotNull Collection<JetScope> possibleResolutionScopes,
@NotNull BindingTrace trace,
@NotNull DeclarationDescriptor shouldBeVisibleFrom
) {
assert canBeImportedDescriptors.size() <= descriptors.size();
assert !possibleResolutionScopes.isEmpty();
//todo completion here needs all possible resolution scopes, if there are many
JetScope resolutionScope = possibleResolutionScopes.iterator().next();
// A special case - will fill all trace information
if (resolveClassPackageAmbiguity(canBeImportedDescriptors, referenceExpression, resolutionScope, trace, shouldBeVisibleFrom)) {
return;
}
// Simple case of no descriptors
if (descriptors.isEmpty()) {
trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, resolutionScope);
trace.report(UNRESOLVED_REFERENCE.on(referenceExpression, referenceExpression));
return;
}
// Decide if expression has resolved reference
DeclarationDescriptor descriptor = null;
if (descriptors.size() == 1) {
descriptor = descriptors.iterator().next();
assert canBeImportedDescriptors.size() <= 1;
}
else if (canBeImportedDescriptors.size() == 1) {
descriptor = canBeImportedDescriptors.iterator().next();
}
if (descriptor != null) {
trace.record(BindingContext.REFERENCE_TARGET, referenceExpression, descriptors.iterator().next());
trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, resolutionScope);
if (descriptor instanceof ClassifierDescriptor) {
symbolUsageValidator.validateTypeUsage((ClassifierDescriptor) descriptor, trace, referenceExpression);
}
if (descriptor instanceof DeclarationDescriptorWithVisibility) {
checkVisibility((DeclarationDescriptorWithVisibility) descriptor, trace, referenceExpression, shouldBeVisibleFrom);
}
}
// Check for more information and additional errors
if (canBeImportedDescriptors.isEmpty()) {
assert descriptors.size() >= 1;
trace.report(CANNOT_BE_IMPORTED.on(referenceExpression, descriptors.iterator().next().getName()));
return;
}
if (canBeImportedDescriptors.size() > 1) {
trace.record(BindingContext.AMBIGUOUS_REFERENCE_TARGET, referenceExpression, descriptors);
}
}
/**
* This method tries to resolve descriptors ambiguity between class descriptor and package descriptor for the same class.
* It's ok choose class for expression reference resolution.
*
* @return <code>true</code> if method has successfully resolved ambiguity
*/
private static boolean resolveClassPackageAmbiguity(
@NotNull Collection<DeclarationDescriptor> filteredDescriptors,
@NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope resolutionScope,
@NotNull BindingTrace trace,
@NotNull DeclarationDescriptor shouldBeVisibleFrom
) {
if (filteredDescriptors.size() == 2) {
PackageViewDescriptor packageView = null;
ClassDescriptor classDescriptor = null;
for (DeclarationDescriptor filteredDescriptor : filteredDescriptors) {
if (filteredDescriptor instanceof PackageViewDescriptor) {
packageView = (PackageViewDescriptor) filteredDescriptor;
}
else if (filteredDescriptor instanceof ClassDescriptor) {
classDescriptor = (ClassDescriptor) filteredDescriptor;
}
}
if (packageView != null && classDescriptor != null) {
if (packageView.getFqName().equalsTo(DescriptorUtils.getFqName(classDescriptor))) {
trace.record(BindingContext.REFERENCE_TARGET, referenceExpression, classDescriptor);
trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, resolutionScope);
checkVisibility(classDescriptor, trace, referenceExpression, shouldBeVisibleFrom);
return true;
}
}
}
return false;
}
private static void checkVisibility(
@NotNull DeclarationDescriptorWithVisibility descriptor,
@NotNull BindingTrace trace,
@NotNull JetSimpleNameExpression referenceExpression,
@NotNull DeclarationDescriptor shouldBeVisibleFrom
) {
if (!Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, shouldBeVisibleFrom)) {
Visibility visibility = descriptor.getVisibility();
if (PsiTreeUtil.getParentOfType(referenceExpression, JetImportDirective.class) != null && !visibility.mustCheckInImports()) {
return;
}
//noinspection ConstantConditions
trace.report(INVISIBLE_REFERENCE.on(referenceExpression, descriptor, visibility, descriptor.getContainingDeclaration()));
}
}
private static class LookupResult {
private final Collection<DeclarationDescriptor> descriptors;
private final JetScope resolutionScope;
private final boolean packageLevel;
public LookupResult(
@NotNull Collection<DeclarationDescriptor> descriptors,
@NotNull JetScope resolutionScope,
boolean packageLevel
) {
this.descriptors = descriptors;
this.resolutionScope = resolutionScope;
this.packageLevel = packageLevel;
}
}
}
@@ -44,7 +44,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
public class TypeResolver(
private val annotationResolver: AnnotationResolver,
private val qualifiedExpressionResolver: QualifiedExpressionResolver,
private val qualifiedExpressionResolver: NewQualifiedExpressionResolver,
private val moduleDescriptor: ModuleDescriptor,
private val flexibleTypeCapabilitiesProvider: FlexibleTypeCapabilitiesProvider,
private val storageManager: StorageManager,
@@ -317,8 +317,7 @@ public class TypeResolver(
}
}
val classifierDescriptor = qualifiedExpressionResolver.lookupDescriptorsForUserType(userType, scope.asJetScope(), trace, true)
.firstIsInstanceOrNull<ClassifierDescriptor>()
val classifierDescriptor = qualifiedExpressionResolver.resolveDescriptorForUserType(userType, scope, trace)
if (classifierDescriptor != null) {
PlatformTypesMappedToKotlinChecker.reportPlatformClassMappedToKotlin(moduleDescriptor, trace, userType, classifierDescriptor)
}
@@ -30,6 +30,12 @@ fun test(b: B) {
val b_2: B = a.B()
b_2.m1()
val b_3: B = B()
b_3.m1()
val b_4: B = a.B()
b_4.m1()
}
@@ -56,6 +62,9 @@ fun test(b: B) {
val b_: B = B()
b_.m1()
val b_2 = B()
b_2.m1()
}
// FILE: top_d.kt
@@ -66,4 +75,7 @@ fun test2(b: B) {
val b_: B = B()
b_.m1()
val b_2 = B()
b_2.m1()
}
@@ -31,6 +31,12 @@ fun test(b: B) {
val b_2: B = a.B()
b_2.m2()
val b_3 = B()
b_3.m2()
val b_4 = a.B()
b_4.m2()
}
@@ -60,4 +66,10 @@ fun test(b: B) {
val b_2 = B()
b_2.m2()
val b_3 = B()
b_3.m2()
val b_4 = <!UNRESOLVED_REFERENCE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>B<!>()
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>b_4<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>m2<!>()
}
@@ -40,6 +40,9 @@ fun test(a_b: b) {
val a_bc: b.c = b.c()
a_bc.a_bc()
val a_bc2 = b.c()
a_bc2.a_bc()
a_fun()
}
@@ -49,6 +52,9 @@ fun test2(ab_c: c) {
val ab_cd: c.d = c.d()
ab_cd.ab_cd()
val ab_cd2 = c.d()
ab_cd2.ab_cd()
ab_fun()
}
@@ -64,6 +70,9 @@ fun test(a_b: b) {
val a_bc: b.c = b.c()
a_bc.a_bc()
val a_bc2 = b.c()
a_bc2.a_bc()
a_fun()
}
@@ -73,6 +82,9 @@ fun test2(ab_c: c) {
val ab_cd: c.d = c.d()
ab_cd.ab_cd()
val ab_cd2 = c.d()
ab_cd2.ab_cd()
ab_fun()
}
@@ -91,6 +103,9 @@ fun test(a_b: b) {
val a_bc: b.c = b.c()
a_bc.a_bc()
val a_bc2 = b.c()
a_bc2.a_bc()
a_fun()
}
@@ -100,6 +115,9 @@ fun test2(ab_c: c) {
val ab_cd: c.d = c.d()
ab_cd.ab_cd()
val ab_cd2 = c.d()
ab_cd2.ab_cd()
ab_fun()
}
@@ -115,6 +133,9 @@ fun test(a_b: b) {
val a_bc: b.c = b.c()
a_bc.a_bc()
val a_bc2 = b.c()
a_bc2.a_bc()
a_fun()
}
@@ -124,5 +145,8 @@ fun test2(ab_c: c) {
val ab_cd: c.d = c.d()
ab_cd.ab_cd()
val ab_cd2 = c.d()
ab_cd2.ab_cd()
ab_fun()
}
@@ -43,7 +43,10 @@ fun test2(_a: a) {
_a._a()
val _ab: a.b = a.b()
_ab.<!UNRESOLVED_REFERENCE!>_ab<!>() // todo
_ab._ab()
val _ab2 = a.b()
_ab2.<!UNRESOLVED_REFERENCE!>_ab<!>() // todo
_fun()
}
@@ -56,7 +59,10 @@ fun test3(_a: a) {
_a._a()
val _ab: a.b = a.b()
_ab.<!UNRESOLVED_REFERENCE!>_ab<!>() // todo
_ab._ab()
val _ab2 = a.b()
_ab2.<!UNRESOLVED_REFERENCE!>_ab<!>() // todo
_fun()
}
@@ -25,10 +25,14 @@ fun test(ab_c: c) {
val ab_c2: a.b.c = a.b.c()
ab_c2.ab_c()
val ab_c3 = a.b.c()
ab_c3.ab_c()
}
fun test2(a_bc: a.b<Int>.c) {
a_bc.<!UNRESOLVED_REFERENCE!>a_bc<!>() // todo
a_bc.ab_c() // todo
}
@@ -58,10 +62,14 @@ import a.b
fun test(a_b: b) {
a_b.a_b()
val a_b2: a.b = a.b()
a_b2.a_b()
val _ab: a.b = a.b()
_ab._ab()
val _ab2 = a.b()
_ab2.<!UNRESOLVED_REFERENCE!>_ab<!>() // todo
}
fun test2(_ab: a<Int>.b) {
_ab.<!UNRESOLVED_REFERENCE!>_ab<!>() // todo
_ab._ab()
_ab.<!UNRESOLVED_REFERENCE!>a_b<!>()
}
@@ -0,0 +1,88 @@
// MODULE: m1
// FILE: a.kt
package a.b
class c {
fun ab_c() {}
}
// MODULE: m2
// FILE: b.kt
package a
fun a_fun() {}
class b {
fun a_b() {}
class c {
fun a_bc() {}
}
}
// MODULE: m3(m1, m2)
// FILE: c.kt
fun test(a_b: a.b) {
a_b.a_b()
val ab_c: a.b.c = a.b.c()
ab_c.ab_c()
ab_c.<!UNRESOLVED_REFERENCE!>a_bc<!>()
val ab_c2 = a.b.c()
ab_c2.ab_c()
ab_c2.<!UNRESOLVED_REFERENCE!>a_bc<!>()
}
fun test2(ab_c: a.b.c) {
ab_c.ab_c()
}
//---- Changed dependence order
// MODULE: _m1
// FILE: _a.kt
package a.b
fun ab_fun() {}
class c {
fun ab_c() {}
class d {
fun ab_cd() {}
}
}
// MODULE: _m2
// FILE: _b.kt
package a
fun a_fun() {}
class b {
fun a_b() {}
class c {
fun a_bc() {}
}
}
// MODULE: _m3(_m1, _m2)
// FILE: _c.kt
fun test(a_b: a.b) {
a_b.a_b()
val ab_c: a.b.c = a.b.c()
ab_c.ab_c()
ab_c.<!UNRESOLVED_REFERENCE!>a_bc<!>()
val ab_c2 = a.b.c()
ab_c2.ab_c()
ab_c2.<!UNRESOLVED_REFERENCE!>a_bc<!>()
}
fun test2(ab_c: a.b.c) {
ab_c.ab_c()
}
@@ -0,0 +1,136 @@
// -- 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
public final class d {
public constructor d()
public final fun ab_cd(): 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
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 fun test(/*0*/ a_b: a.b): kotlin.Unit
public fun test2(/*0*/ ab_c: a.b.c): kotlin.Unit
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> --
}
}
}
// -- Module: <m1> --
package
package a {
package a.b {
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
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 fun test(/*0*/ a_b: a.b): kotlin.Unit
public fun test2(/*0*/ ab_c: a.b.c): kotlin.Unit
package a {
public fun a_fun(): kotlin.Unit
public final class b {
// -- Module: <m2> --
}
package a.b {
public final class c {
// -- Module: <m1> --
}
}
}
@@ -0,0 +1,44 @@
// MODULE: m1
// FILE: a.kt
package a
class b {
fun a_b() {}
}
// MODULE: m2
// FILE: b.kt
class a {
class b {
fun _ab() {}
}
}
// MODULE: m3(m1, m2)
// FILE: c1.kt
package some
fun test(a_b: a.b) {
a_b.a_b()
val a_b2 = a.b()
a_b2.a_b()
}
// FILE: c2.kt
package a
fun test(a_b: a.b) {
a_b.a_b()
val a_b2 = a.b()
a_b2.a_b()
}
// FILE: c3.kt
fun test(_ab: a.b) {
_ab._ab()
val _ab2 = a.b()
_ab2.<!UNRESOLVED_REFERENCE!>_ab<!>() // todo
}
@@ -0,0 +1,56 @@
// -- Module: <m1> --
package
package a {
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
}
}
// -- Module: <m2> --
package
public final class a {
public constructor a()
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
}
}
// -- Module: <m3> --
package
public fun test(/*0*/ _ab: a.b): kotlin.Unit
public final class a {
// -- Module: <m2> --
}
package a {
public fun test(/*0*/ a_b: a.b): kotlin.Unit
public final class b {
// -- Module: <m1> --
}
}
package some {
public fun test(/*0*/ a_b: a.b): kotlin.Unit
}
@@ -0,0 +1,31 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -UNREACHABLE_CODE
class A {
class B {
class C
}
}
fun test(a: A.<!SYNTAX!><!>): A.<!SYNTAX!><!> {
val aa: A. <!SYNTAX!>=<!><!SYNTAX!><!> null!!
}
fun test1(a: A.B.<!SYNTAX!><!>): A.B.<!SYNTAX!><!> {
val aa: A.B. <!SYNTAX!>=<!><!SYNTAX!><!> null!!
}
fun test2(a: A.<!UNRESOLVED_REFERENCE!>e<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>C<!>): A.<!UNRESOLVED_REFERENCE!>e<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>C<!> {
val aa: A.<!UNRESOLVED_REFERENCE!>e<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>C<!> = null!!
}
fun test3(a: <!UNRESOLVED_REFERENCE!>a<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>A<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>C<!>): <!UNRESOLVED_REFERENCE!>a<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>A<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>C<!> {
val aa: <!UNRESOLVED_REFERENCE!>a<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>A<!>.<!DEBUG_INFO_MISSING_UNRESOLVED!>C<!> = null!!
}
fun test4(a: A.B.<!UNRESOLVED_REFERENCE!>ee<!>): A.B.<!UNRESOLVED_REFERENCE!>ee<!> {
val aa: A.B.<!UNRESOLVED_REFERENCE!>ee<!> = null!!
}
fun test5(a: A.<!UNRESOLVED_REFERENCE!>ee<!>): A.<!UNRESOLVED_REFERENCE!>ee<!> {
val aa: A.<!UNRESOLVED_REFERENCE!>ee<!> = null!!
}
@@ -0,0 +1,29 @@
package
public fun test(/*0*/ a: [ERROR : A.]): [ERROR : A.]
public fun test1(/*0*/ a: [ERROR : A.B.]): [ERROR : A.B.]
public fun test2(/*0*/ a: [ERROR : A.e.C]): [ERROR : A.e.C]
public fun test3(/*0*/ a: [ERROR : a.A.C]): [ERROR : a.A.C]
public fun test4(/*0*/ a: [ERROR : A.B.ee]): [ERROR : A.B.ee]
public fun test5(/*0*/ a: [ERROR : A.ee]): [ERROR : A.ee]
public final class A {
public constructor A()
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 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 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
}
}
}
@@ -0,0 +1,58 @@
// MODULE: m1
// FILE: a.kt
package a
class b {
fun a_b() {}
}
// MODULE: m2
// FILE: b.kt
package some
class a {
class b {
fun some_ab() {}
}
}
// MODULE: m3(m1, m2)
// FILE: c1.kt
package other
class a {}
fun test(a_: a.<!UNRESOLVED_REFERENCE!>b<!>) {
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_b<!>()
val a_2 = a.b()
a_2.a_b() // todo: must be unresolved
a_2.<!UNRESOLVED_REFERENCE!>some_ab<!>()
a_2.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a_()<!>
}
// FILE: c2.kt
package other2
class a {
class b {
fun other2_ab() {}
}
}
fun test(_ab: a.b) {
_ab.other2_ab()
val _ab2 = a.b()
_ab2.<!UNRESOLVED_REFERENCE!>other2_ab<!>() // todo
}
// FILE: c3.kt
package some
fun test(_ab: a.b) {
_ab.some_ab()
val _ab2 = a.b()
_ab2.<!UNRESOLVED_REFERENCE!>some_ab<!>() // todo
}
@@ -0,0 +1,84 @@
// -- Module: <m1> --
package
package a {
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
}
}
// -- Module: <m2> --
package
package some {
public final class a {
public constructor a()
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 open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final fun some_ab(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
// -- Module: <m3> --
package
package a {
public final class b {
// -- Module: <m1> --
}
}
package other {
public fun test(/*0*/ a_: [ERROR : a.b]): kotlin.Unit
public final class a {
public constructor a()
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 other2 {
public fun test(/*0*/ _ab: other2.a.b): kotlin.Unit
public final class a {
public constructor a()
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 open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final fun other2_ab(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
}
package some {
public fun test(/*0*/ _ab: some.a.b): kotlin.Unit
public final class a {
// -- Module: <m2> --
}
}
@@ -6543,12 +6543,6 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("GenericClassVsPackage.kt")
public void testGenericClassVsPackage() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/imports/GenericClassVsPackage.kt");
doTest(fileName);
}
@TestMetadata("ImportFromCurrentWithDifferentName.kt")
public void testImportFromCurrentWithDifferentName() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/imports/ImportFromCurrentWithDifferentName.kt");
@@ -11029,6 +11023,45 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
}
}
@TestMetadata("compiler/testData/diagnostics/tests/qualifiedExpression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class QualifiedExpression extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInQualifiedExpression() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/qualifiedExpression"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("GenericClassVsPackage.kt")
public void testGenericClassVsPackage() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/GenericClassVsPackage.kt");
doTest(fileName);
}
@TestMetadata("PackageVsClass.kt")
public void testPackageVsClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/PackageVsClass.kt");
doTest(fileName);
}
@TestMetadata("PackageVsRootClass.kt")
public void testPackageVsRootClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/PackageVsRootClass.kt");
doTest(fileName);
}
@TestMetadata("TypeWithError.kt")
public void testTypeWithError() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/TypeWithError.kt");
doTest(fileName);
}
@TestMetadata("visibleClassVsQualifiedClass.kt")
public void testVisibleClassVsQualifiedClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/visibleClassVsQualifiedClass.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/diagnostics/tests/reassignment")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)