KT-6026 Exception on instantiating a nested class in an anonymous object

#KT-6026 Fixed
This commit is contained in:
Svetlana Isakova
2014-10-15 20:42:28 +04:00
parent c0c9552f4c
commit 595b3ffe23
5 changed files with 33 additions and 13 deletions
@@ -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");
@@ -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;
}