KT-6026 Exception on instantiating a nested class in an anonymous object
#KT-6026 Fixed
This commit is contained in:
+14
-11
@@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.calls.inference.*;
|
||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
||||
import org.jetbrains.jet.lang.resolve.descriptorUtil.DescriptorUtilPackage;
|
||||
@@ -137,19 +138,21 @@ public abstract class AbstractTracingStrategy implements TracingStrategy {
|
||||
@NotNull ExplicitReceiverKind explicitReceiverKind
|
||||
) {
|
||||
if (explicitReceiverKind == ExplicitReceiverKind.NO_EXPLICIT_RECEIVER) {
|
||||
String qualifiedName;
|
||||
FqName fqName = getFqNameFromTopLevelClass(DescriptorUtilPackage.getImportableDescriptor(classDescriptor));
|
||||
if (reference.getParent() instanceof JetCallableReferenceExpression) {
|
||||
qualifiedName = fqName.parent() + "::" + classDescriptor.getName();
|
||||
DeclarationDescriptor importableDescriptor = DescriptorUtilPackage.getImportableDescriptor(classDescriptor);
|
||||
if (DescriptorUtils.getFqName(importableDescriptor).isSafe()) {
|
||||
FqName fqName = getFqNameFromTopLevelClass(importableDescriptor);
|
||||
String qualifiedName;
|
||||
if (reference.getParent() instanceof JetCallableReferenceExpression) {
|
||||
qualifiedName = fqName.parent() + "::" + classDescriptor.getName();
|
||||
}
|
||||
else {
|
||||
qualifiedName = fqName.asString();
|
||||
}
|
||||
trace.report(NESTED_CLASS_SHOULD_BE_QUALIFIED.on(reference, classDescriptor, qualifiedName));
|
||||
return;
|
||||
}
|
||||
else {
|
||||
qualifiedName = fqName.asString();
|
||||
}
|
||||
trace.report(NESTED_CLASS_SHOULD_BE_QUALIFIED.on(reference, classDescriptor, qualifiedName));
|
||||
}
|
||||
else {
|
||||
trace.report(NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE.on(reference, classDescriptor));
|
||||
}
|
||||
trace.report(NESTED_CLASS_ACCESSED_VIA_INSTANCE_REFERENCE.on(reference, classDescriptor));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
// KT-6026 Exception on instantiating a nested class in an anonymous object
|
||||
|
||||
val oo = object {
|
||||
class Nested
|
||||
|
||||
fun f1() = Nested(<!TOO_MANY_ARGUMENTS!>11<!>)
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
package
|
||||
|
||||
internal val oo: kotlin.Any
|
||||
@@ -5991,6 +5991,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt6026.kt")
|
||||
public void testKt6026() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inner/kt6026.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("localClass.kt")
|
||||
public void testLocalClass() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inner/localClass.kt");
|
||||
|
||||
+3
-2
@@ -29,10 +29,10 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
|
||||
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
||||
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils;
|
||||
|
||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqName;
|
||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqNameSafe;
|
||||
|
||||
public final class DecompiledNavigationUtils {
|
||||
|
||||
@@ -117,7 +117,8 @@ public final class DecompiledNavigationUtils {
|
||||
|| ExpressionTypingUtils.isLocal(containerDescriptor.getContainingDeclaration(), containerDescriptor)) {
|
||||
return getContainerFqName(containerDescriptor.getContainingDeclaration());
|
||||
}
|
||||
return getFqNameSafe(containerDescriptor);
|
||||
FqNameUnsafe fqNameUnsafe = getFqName(containerDescriptor);
|
||||
return fqNameUnsafe.isSafe() ? fqNameUnsafe.toSafe() : null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user