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 193e4d5cee3..a35cf47b33f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -20,6 +20,7 @@ import com.google.common.base.Function; import com.google.common.collect.Lists; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.impl.CheckUtil; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.psi.tree.IElementType; @@ -534,4 +535,28 @@ public class JetPsiUtil { List statements = blockExpression.getStatements(); return statements.isEmpty() ? null : statements.get(statements.size() - 1); } + + @Nullable + public static JetClassOrObject getOutermostClassOrObject(@NotNull JetClassOrObject classOrObject) { + JetClassOrObject current = classOrObject; + while (true) { + PsiElement parent = current.getParent(); + assert classOrObject.getParent() != null : "Class with no parent: " + classOrObject.getText(); + + if (parent instanceof PsiFile) { + return current; + } + if (parent instanceof JetClassObject) { + // current class IS the class object declaration + parent = parent.getParent(); + assert parent instanceof JetClassBody : "Parent of class object is not a class body: " + parent; + } + if (!(parent instanceof JetClassBody)) { + // It is a local class, no legitimate outer + return null; + } + + current = (JetClassOrObject) parent.getParent(); + } + } } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java index 660ef482d63..872921375c8 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/KotlinLightClassForExplicitDeclaration.java @@ -150,25 +150,12 @@ public class KotlinLightClassForExplicitDeclaration extends AbstractLightClass i @NotNull private static JetClassOrObject getOutermostClassOrObject(@NotNull JetClassOrObject classOrObject) { - JetClassOrObject current = classOrObject; - while (true) { - PsiElement parent = current.getParent(); - assert classOrObject.getParent() != null : "Class with no parent: " + classOrObject.getText(); - - if (parent instanceof PsiFile) { - return current; - } - if (parent instanceof JetClassObject) { - // current class IS the class object declaration - parent = parent.getParent(); - assert parent instanceof JetClassBody : "Parent of class object is not a class body: " + parent; - } - if (!(parent instanceof JetClassBody)) { - // It is a local class, no legitimate outer - throw new IllegalStateException("Attempt to build a light class for a local class: " + classOrObject.getText()); - } - - current = (JetClassOrObject) parent.getParent(); + JetClassOrObject outermostClass = JetPsiUtil.getOutermostClassOrObject(classOrObject); + if (outermostClass == null) { + throw new IllegalStateException("Attempt to build a light class for a local class: " + classOrObject.getText()); + } + else { + return outermostClass; } }