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; }