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 a35cf47b33f..088a1c8f70d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -536,6 +536,10 @@ public class JetPsiUtil { return statements.isEmpty() ? null : statements.get(statements.size() - 1); } + public static boolean isLocalClass(@NotNull JetClassOrObject classOrObject) { + return getOutermostClassOrObject(classOrObject) == null; + } + @Nullable public static JetClassOrObject getOutermostClassOrObject(@NotNull JetClassOrObject classOrObject) { JetClassOrObject current = classOrObject; diff --git a/compiler/testData/psiUtil/isLocalClass.kt b/compiler/testData/psiUtil/isLocalClass.kt new file mode 100644 index 00000000000..fc68f742e33 --- /dev/null +++ b/compiler/testData/psiUtil/isLocalClass.kt @@ -0,0 +1,21 @@ +class A { + class B + object G + + class object { + class C + object H + + fun foo() { + class DLocal + object KLocal + } + } + + fun foo2() { + class ELocal { + class FLocal + } + object LLocal + } +} diff --git a/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java b/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java index d1d52eaa002..e58f05676cf 100644 --- a/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java +++ b/compiler/tests/org/jetbrains/jet/lang/psi/JetPsiUtilTest.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.psi; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.util.PsiTreeUtil; import junit.framework.Assert; import org.jetbrains.jet.JetLiteFixture; @@ -25,8 +26,11 @@ import org.jetbrains.jet.lang.resolve.ImportPath; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; +import java.io.File; +import java.io.IOException; +import java.util.Collection; + public class JetPsiUtilTest extends JetLiteFixture { - public void testUnquotedIdentifier() { Assert.assertEquals("", JetPsiUtil.unquoteIdentifier("")); Assert.assertEquals("a2", JetPsiUtil.unquoteIdentifier("a2")); @@ -63,6 +67,24 @@ public class JetPsiUtilTest extends JetLiteFixture { Assert.assertNotSame(new ImportPath(new FqName("some.test"), false), getImportPathFromParsed("import some.Test")); } + public void testIsLocalClass() throws IOException { + String text = FileUtil.loadFile(new File(getTestDataPath() + "/psiUtil/isLocalClass.kt")); + JetClass aClass = JetPsiFactory.createClass(getProject(), text); + + @SuppressWarnings("unchecked") + Collection classOrObjects = PsiTreeUtil.collectElementsOfType(aClass, JetClassOrObject.class); + + for (JetClassOrObject classOrObject : classOrObjects) { + String classOrObjectName = classOrObject.getName(); + if (classOrObjectName != null && classOrObjectName.contains("Local")) { + assertTrue("JetPsiUtil.isLocalClass should return true for " + classOrObjectName, JetPsiUtil.isLocalClass(classOrObject)); + } + else { + assertFalse("JetPsiUtil.isLocalClass should return false for " + classOrObjectName, JetPsiUtil.isLocalClass(classOrObject)); + } + } + } + @Override protected JetCoreEnvironment createEnvironment() { return new JetCoreEnvironment(getTestRootDisposable(), new CompilerConfiguration());