diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index 525be31df08..7336820ded1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -128,18 +128,24 @@ public class JetPsiUtil { return getFQName(file.getNamespaceHeader()); } - public static String getFQName(JetClass jetClass) { + public static String getFQName(JetClassOrObject jetClass) { PsiElement parent = jetClass.getParent(); if (parent instanceof JetFile) { return makeFQName(getFQName((JetFile) parent), jetClass); } - if (parent instanceof JetClass) { - return makeFQName(getFQName(((JetClass) parent)), jetClass); + while (parent instanceof JetClassBody) { + parent = parent.getParent(); + if (parent instanceof JetObjectDeclaration && parent.getParent() instanceof JetClassObject) { + parent = parent.getParent().getParent(); + } + } + if (parent instanceof JetClassOrObject) { + return makeFQName(getFQName(((JetClassOrObject) parent)), jetClass); } return jetClass.getName(); } - private static String makeFQName(String prefix, JetClass jetClass) { - return (prefix.length() == 0 ? "" : prefix + ".") + jetClass.getName(); + private static String makeFQName(String prefix, JetClassOrObject jetClass) { + return ((prefix == null || prefix.length() == 0) ? "" : prefix + ".") + jetClass.getName(); } } diff --git a/compiler/testData/diagnostics/tests/scopes/kt900.jet b/compiler/testData/diagnostics/tests/scopes/kt900.jet new file mode 100644 index 00000000000..ab9cd880977 --- /dev/null +++ b/compiler/testData/diagnostics/tests/scopes/kt900.jet @@ -0,0 +1,69 @@ +//FILE:a.kt +//KT-900 Inaccessible class should be unresolved + +package a + +fun foo() { + val b : B = B() //only B() is unresolved, but in ": B" and "B.foo()" B should also be unresolved + B.foo() + + P.foo() + + M.bar() +} + +class A() { + class object { + class B() { + class object { + fun foo() {} + } + } + + object P { + fun foo() {} + } + } +} + +object N { + object M { + fun bar() {} + } +} + +//FILE:b.kt +package b + +import N.M +import A.P +import b.A.B + +fun foo() { + val b : B = B() + B.foo() + + P.foo() + + M.bar() +} + +class A() { + class object { + class B() { + class object { + fun foo() {} + } + } + + object P { + fun foo() {} + } + } +} + +object N { + object M { + fun bar() {} + } +}