From 595b3ffe23b57cae696e74660a1e72f9188c5447 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 15 Oct 2014 20:42:28 +0400 Subject: [PATCH] KT-6026 Exception on instantiating a nested class in an anonymous object #KT-6026 Fixed --- .../calls/tasks/AbstractTracingStrategy.java | 25 +++++++++++-------- .../diagnostics/tests/inner/kt6026.kt | 7 ++++++ .../diagnostics/tests/inner/kt6026.txt | 3 +++ .../checkers/JetDiagnosticsTestGenerated.java | 6 +++++ .../libraries/DecompiledNavigationUtils.java | 5 ++-- 5 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inner/kt6026.kt create mode 100644 compiler/testData/diagnostics/tests/inner/kt6026.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java index 513ab1f8ba8..abe78cf1368 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/tasks/AbstractTracingStrategy.java @@ -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 diff --git a/compiler/testData/diagnostics/tests/inner/kt6026.kt b/compiler/testData/diagnostics/tests/inner/kt6026.kt new file mode 100644 index 00000000000..e55d6048968 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inner/kt6026.kt @@ -0,0 +1,7 @@ +// KT-6026 Exception on instantiating a nested class in an anonymous object + +val oo = object { + class Nested + + fun f1() = Nested(11) +} diff --git a/compiler/testData/diagnostics/tests/inner/kt6026.txt b/compiler/testData/diagnostics/tests/inner/kt6026.txt new file mode 100644 index 00000000000..60695f5c042 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inner/kt6026.txt @@ -0,0 +1,3 @@ +package + +internal val oo: kotlin.Any \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 05f0f57aa84..e53ec3a7c4c 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -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"); diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DecompiledNavigationUtils.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DecompiledNavigationUtils.java index e5a8a3ffd9d..883dee38bfe 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DecompiledNavigationUtils.java +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/libraries/DecompiledNavigationUtils.java @@ -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; }