From 594c966c44cd654889b2df580ad3b38412af7a47 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 8 Nov 2013 18:01:21 +0400 Subject: [PATCH] Add local class/object declarations to super name index --- .../jetbrains/jet/lang/psi/JetPsiUtil.java | 6 ++- .../psi/stubs/PsiJetClassOrObjectStub.java | 2 + .../stubs/elements/JetClassElementType.java | 24 +++++++-- .../stubs/elements/JetFileElementType.java | 2 +- .../stubs/elements/JetObjectElementType.java | 27 +++++----- .../psi/stubs/impl/PsiJetClassStubImpl.java | 18 +++++-- .../psi/stubs/impl/PsiJetObjectStubImpl.java | 19 +++++-- .../stubindex/StubIndexServiceImpl.java | 27 +++++----- .../jet/plugin/stubs/JetStubsTest.java | 53 +++++++++++++++---- 9 files changed, 128 insertions(+), 50 deletions(-) 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 f6f130e919c..375d94b1cfe 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -1008,8 +1008,10 @@ public class JetPsiUtil { } //noinspection unchecked - JetElement container = - PsiTreeUtil.getParentOfType(declaration, JetBlockExpression.class, JetClassInitializer.class); + JetElement container = PsiTreeUtil.getParentOfType( + declaration, + JetBlockExpression.class, JetClassInitializer.class, JetProperty.class, JetFunction.class + ); if (container == null) return null; return (container instanceof JetClassInitializer) ? ((JetClassInitializer) container).getBody() : container; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassOrObjectStub.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassOrObjectStub.java index eac47a1c992..7ab610fa1f8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassOrObjectStub.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassOrObjectStub.java @@ -22,6 +22,8 @@ import org.jetbrains.jet.lang.psi.JetClassOrObject; import java.util.List; public interface PsiJetClassOrObjectStub extends PsiJetStubWithFqName { + boolean isLocal(); + @NotNull List getSuperNames(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java index f0855c730f9..0ee3556c5a2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java @@ -50,13 +50,29 @@ public class JetClassElementType extends JetStubElementType superNames = PsiUtilPackage.getSuperNames(psi); - return new PsiJetClassStubImpl(getStubType(isEnumEntry), parentStub, fqName != null ? fqName.asString() : null, psi.getName(), - superNames, psi.isTrait(), psi.isEnum(), isEnumEntry, psi.isAnnotation(), psi.isInner()); + return new PsiJetClassStubImpl( + getStubType(isEnumEntry), + parentStub, + fqName != null ? fqName.asString() : null, + psi.getName(), + superNames, + psi.isTrait(), + psi.isEnum(), + isEnumEntry, + psi.isAnnotation(), + psi.isInner(), + JetPsiUtil.isLocal(psi) + ); } @Override @@ -69,6 +85,7 @@ public class JetClassElementType extends JetStubElementType superNames = stub.getSuperNames(); dataStream.writeVarInt(superNames.size()); @@ -87,6 +104,7 @@ public class JetClassElementType extends JetStubElementType { - public static final int STUB_VERSION = 25; + public static final int STUB_VERSION = 26; public JetFileElementType() { super("jet.FILE", JetLanguage.INSTANCE); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java index 54ec323a677..9679482217b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetObjectElementType.java @@ -17,7 +17,6 @@ package org.jetbrains.jet.lang.psi.stubs.elements; import com.intellij.lang.ASTNode; -import com.intellij.psi.PsiElement; import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; @@ -27,6 +26,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetClassObject; import org.jetbrains.jet.lang.psi.JetObjectDeclaration; +import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.psiUtil.PsiUtilPackage; import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub; import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetObjectStubImpl; @@ -52,15 +52,7 @@ public class JetObjectElementType extends JetStubElementType superNames = PsiUtilPackage.getSuperNames(psi); return new PsiJetObjectStubImpl( - JetStubElementTypes.OBJECT_DECLARATION, parentStub, name, fqName, superNames, psi.isTopLevel(), isClassObject(psi) + JetStubElementTypes.OBJECT_DECLARATION, + parentStub, + name, + fqName, + superNames, + psi.isTopLevel(), + isClassObject(psi), + JetPsiUtil.isLocal(psi) ); } @@ -82,6 +81,7 @@ public class JetObjectElementType extends JetStubElementType superNames = stub.getSuperNames(); dataStream.writeVarInt(superNames.size()); @@ -99,6 +99,7 @@ public class JetObjectElementType extends JetStubElementType implements PsiJetCla private final boolean isEnumEntry; private final boolean isAnnotation; private final boolean isInner; + private final boolean isLocal; public PsiJetClassStubImpl( JetClassElementType type, @@ -47,9 +48,9 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla @Nullable String qualifiedName, String name, List superNames, - boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, boolean isInner) { + boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, boolean isInner, boolean isLocal) { this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), wrapStrings(superNames), - isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner); + isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner, isLocal); } public PsiJetClassStubImpl( @@ -62,7 +63,8 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, - boolean isInner) { + boolean isInner, + boolean isLocal) { super(parent, type); this.qualifiedName = qualifiedName; this.name = name; @@ -72,6 +74,7 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla this.isEnumEntry = isEnumEntry; this.isAnnotation = isAnnotation; this.isInner = isInner; + this.isLocal = isLocal; } private static StringRef[] wrapStrings(List names) { @@ -116,6 +119,11 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla return isInner; } + @Override + public boolean isLocal() { + return isLocal; + } + @Override public String getName() { return StringRef.toString(name); @@ -156,6 +164,10 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla builder.append("inner "); } + if (isLocal()) { + builder.append("local "); + } + builder.append("name=").append(getName()); builder.append(" fqn=").append(getFqName()); builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetObjectStubImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetObjectStubImpl.java index fd9eb03ba42..4ba978cb6c3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetObjectStubImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetObjectStubImpl.java @@ -37,6 +37,7 @@ public class PsiJetObjectStubImpl extends StubBase impleme private final StringRef[] superNames; private final boolean isTopLevel; private final boolean isClassObject; + private final boolean isLocal; public PsiJetObjectStubImpl( @NotNull IStubElementType elementType, @@ -45,9 +46,10 @@ public class PsiJetObjectStubImpl extends StubBase impleme @Nullable FqName fqName, @NotNull List superNames, boolean isTopLevel, - boolean isClassObject + boolean isClassObject, + boolean isLocal ) { - this(elementType, parent, StringRef.fromString(name), fqName, Utils.instance$.wrapStrings(superNames), isTopLevel, isClassObject); + this(elementType, parent, StringRef.fromString(name), fqName, Utils.instance$.wrapStrings(superNames), isTopLevel, isClassObject, isLocal); } public PsiJetObjectStubImpl( @@ -57,7 +59,8 @@ public class PsiJetObjectStubImpl extends StubBase impleme @Nullable FqName fqName, @NotNull StringRef[] superNames, boolean isTopLevel, - boolean isClassObject) { + boolean isClassObject, + boolean isLocal) { super(parent, elementType); this.name = name; @@ -65,6 +68,7 @@ public class PsiJetObjectStubImpl extends StubBase impleme this.superNames = superNames; this.isTopLevel = isTopLevel; this.isClassObject = isClassObject; + this.isLocal = isLocal; } @Override @@ -98,6 +102,11 @@ public class PsiJetObjectStubImpl extends StubBase impleme return isClassObject; } + @Override + public boolean isLocal() { + return isLocal; + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); @@ -112,6 +121,10 @@ public class PsiJetObjectStubImpl extends StubBase impleme builder.append("top "); } + if (isLocal()) { + builder.append("local "); + } + builder.append("name=").append(getName()); builder.append(" fqName=").append(fqName != null ? fqName.toString() : "null"); builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]"); diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java b/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java index c43be7e5dd6..3c9295b73f8 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java @@ -47,23 +47,16 @@ public class StubIndexServiceImpl implements StubIndexService { if (name != null) { sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name); } - + FqName fqn = stub.getFqName(); if (fqn != null) { sink.occurrence(JetFullClassNameIndex.getInstance().getKey(), fqn.asString()); } indexSuperNames(stub, sink); - recordClassOrObjectByPackage(stub, sink); } - private static void indexSuperNames(PsiJetClassOrObjectStub stub, IndexSink sink) { - for (String superName : stub.getSuperNames()) { - sink.occurrence(JetSuperClassIndex.getInstance().getKey(), superName); - } - } - @Override public void indexObject(PsiJetObjectStub stub, IndexSink sink) { String name = stub.getName(); @@ -80,14 +73,13 @@ public class StubIndexServiceImpl implements StubIndexService { fqName = parentFqName.child(Name.identifier(name)); } } - else { - assert name != null; - } - sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name); + if (name != null) { + sink.occurrence(JetShortClassNameIndex.getInstance().getKey(), name); - if (stub.isTopLevel()) { - sink.occurrence(JetTopLevelShortObjectNameIndex.getInstance().getKey(), name); + if (stub.isTopLevel()) { + sink.occurrence(JetTopLevelShortObjectNameIndex.getInstance().getKey(), name); + } } if (fqName != null) { @@ -95,10 +87,15 @@ public class StubIndexServiceImpl implements StubIndexService { } indexSuperNames(stub, sink); - recordClassOrObjectByPackage(stub, sink); } + private static void indexSuperNames(PsiJetClassOrObjectStub stub, IndexSink sink) { + for (String superName : stub.getSuperNames()) { + sink.occurrence(JetSuperClassIndex.getInstance().getKey(), superName); + } + } + private static void recordClassOrObjectByPackage(StubElement stub, IndexSink sink) { StubElement parentStub = stub.getParentStub(); if (parentStub instanceof PsiJetFileStub) { diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java index edbb6087abe..ef09f6a7a9b 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java @@ -27,9 +27,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetClass; import org.jetbrains.jet.lang.psi.JetDeclaration; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetObjectDeclaration; import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub; -import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub; import org.jetbrains.jet.lang.psi.stubs.elements.JetFileStubBuilder; import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes; import org.jetbrains.jet.plugin.JetFileType; @@ -86,8 +84,9 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase { public void testFunctionInNotNamedObject() { doBuildTest("object { fun testing() = 12 }", "PsiJetFileStubImpl[package=]\n" + - " FUN:PsiJetFunctionStubImpl[name=testing]\n" + - " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n"); + " OBJECT_DECLARATION:PsiJetObjectStubImpl[top name=null fqName=null superNames=[]]\n" + + " FUN:PsiJetFunctionStubImpl[name=testing]\n" + + " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n"); } public void testFunctionParameters() { @@ -99,13 +98,6 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase { " VALUE_PARAMETER:PsiJetParameterStubImpl[val name=other typeText=String defaultValue=\"hello\"]\n"); } - public void testNotStoreInFunction() { - doBuildTest("fun some() { val test = 12;\n fun fake() {}\n class FakeClass\n }", - "PsiJetFileStubImpl[package=]\n" + - " FUN:PsiJetFunctionStubImpl[top topFQName=some name=some]\n" + - " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n"); - } - public void testPackageProperty() { doBuildTest("package test.testing\n" + "val some = 12", @@ -175,6 +167,26 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase { " CLASS:PsiJetClassStubImpl[inner name=B fqn=A.B superNames=[]]\n"); } + public void testLocalClass() { + doBuildTest("class A\ntrait T\nfun foo() { class Test: A(), T }", + "PsiJetFileStubImpl[package=]\n" + + " CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" + + " CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" + + " FUN:PsiJetFunctionStubImpl[top topFQName=foo name=foo]\n" + + " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n" + + " CLASS:PsiJetClassStubImpl[local name=Test fqn=null superNames=[AT]]\n"); + } + + public void testLocalClassInLocalFunction() { + doBuildTest("class A\ntrait T\nfun foo() { fun bar() { class Test: A(), T } }", + "PsiJetFileStubImpl[package=]\n" + + " CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" + + " CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" + + " FUN:PsiJetFunctionStubImpl[top topFQName=foo name=foo]\n" + + " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n" + + " CLASS:PsiJetClassStubImpl[local name=Test fqn=null superNames=[AT]]\n"); + } + public void testNamedObject() { doBuildTest("class A\ntrait T\nobject Test: A(), T {}", "PsiJetFileStubImpl[package=]\n" + @@ -183,6 +195,25 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase { " OBJECT_DECLARATION:PsiJetObjectStubImpl[top name=Test fqName=Test superNames=[AT]]\n"); } + public void testLocalNamedObject() { + doBuildTest("class A\ntrait T\nfun foo() { object O: A(), T }", + "PsiJetFileStubImpl[package=]\n" + + " CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" + + " CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" + + " FUN:PsiJetFunctionStubImpl[top topFQName=foo name=foo]\n" + + " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n" + + " OBJECT_DECLARATION:PsiJetObjectStubImpl[local name=O fqName=null superNames=[AT]]\n"); + } + + public void testAnonymousObject() { + doBuildTest("class A\ntrait T\nval obj = object : A(), T", + "PsiJetFileStubImpl[package=]\n" + + " CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" + + " CLASS:PsiJetClassStubImpl[trait name=T fqn=T superNames=[]]\n" + + " PROPERTY:PsiJetPropertyStubImpl[val top topFQName=obj name=obj typeText=null bodyText=object : A(), T]\n" + + " OBJECT_DECLARATION:PsiJetObjectStubImpl[local name=null fqName=null superNames=[AT]]\n"); + } + public void testAnnotationOnClass() { doBuildTest("Deprecated class Test {}", "PsiJetFileStubImpl[package=]\n" +