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.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
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.inference.*;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.jet.lang.resolve.descriptorUtil.DescriptorUtilPackage;
|
import org.jetbrains.jet.lang.resolve.descriptorUtil.DescriptorUtilPackage;
|
||||||
@@ -137,19 +138,21 @@ public abstract class AbstractTracingStrategy implements TracingStrategy {
|
|||||||
@NotNull ExplicitReceiverKind explicitReceiverKind
|
@NotNull ExplicitReceiverKind explicitReceiverKind
|
||||||
) {
|
) {
|
||||||
if (explicitReceiverKind == ExplicitReceiverKind.NO_EXPLICIT_RECEIVER) {
|
if (explicitReceiverKind == ExplicitReceiverKind.NO_EXPLICIT_RECEIVER) {
|
||||||
String qualifiedName;
|
DeclarationDescriptor importableDescriptor = DescriptorUtilPackage.getImportableDescriptor(classDescriptor);
|
||||||
FqName fqName = getFqNameFromTopLevelClass(DescriptorUtilPackage.getImportableDescriptor(classDescriptor));
|
if (DescriptorUtils.getFqName(importableDescriptor).isSafe()) {
|
||||||
if (reference.getParent() instanceof JetCallableReferenceExpression) {
|
FqName fqName = getFqNameFromTopLevelClass(importableDescriptor);
|
||||||
qualifiedName = fqName.parent() + "::" + classDescriptor.getName();
|
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
|
@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);
|
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")
|
@TestMetadata("localClass.kt")
|
||||||
public void testLocalClass() throws Exception {
|
public void testLocalClass() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inner/localClass.kt");
|
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.java.PackageClassUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
|
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
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 org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils;
|
||||||
|
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqName;
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqName;
|
||||||
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFqNameSafe;
|
|
||||||
|
|
||||||
public final class DecompiledNavigationUtils {
|
public final class DecompiledNavigationUtils {
|
||||||
|
|
||||||
@@ -117,7 +117,8 @@ public final class DecompiledNavigationUtils {
|
|||||||
|| ExpressionTypingUtils.isLocal(containerDescriptor.getContainingDeclaration(), containerDescriptor)) {
|
|| ExpressionTypingUtils.isLocal(containerDescriptor.getContainingDeclaration(), containerDescriptor)) {
|
||||||
return getContainerFqName(containerDescriptor.getContainingDeclaration());
|
return getContainerFqName(containerDescriptor.getContainingDeclaration());
|
||||||
}
|
}
|
||||||
return getFqNameSafe(containerDescriptor);
|
FqNameUnsafe fqNameUnsafe = getFqName(containerDescriptor);
|
||||||
|
return fqNameUnsafe.isSafe() ? fqNameUnsafe.toSafe() : null;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user