From 84e4611d2b6dc7d088785f6af8793d24ffee7e60 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 29 Nov 2012 16:15:36 +0400 Subject: [PATCH] Add 'inner' keyword Support for the keyword in PSI and stubs #KT-1174 In Progress --- .../org/jetbrains/jet/lang/psi/JetClass.java | 9 +++++++ .../jet/lang/psi/stubs/PsiJetClassStub.java | 2 ++ .../stubs/elements/JetClassElementType.java | 7 ++++-- .../psi/stubs/impl/PsiJetClassStubImpl.java | 18 +++++++++++--- .../org/jetbrains/jet/lexer/JetTokens.java | 5 ++-- compiler/testData/psi/Inner.jet | 3 +++ compiler/testData/psi/Inner.txt | 24 +++++++++++++++++++ .../jet/plugin/stubs/JetStubsTest.java | 9 +++++++ 8 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/psi/Inner.jet create mode 100644 compiler/testData/psi/Inner.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java index 856910aac40..2db238b443d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java @@ -160,6 +160,15 @@ public class JetClass extends JetTypeParameterListOwnerStub imp return hasModifier(JetTokens.ANNOTATION_KEYWORD); } + public boolean isInner() { + PsiJetClassStub stub = getStub(); + if (stub != null) { + return stub.isInner(); + } + + return hasModifier(JetTokens.INNER_KEYWORD); + } + @NotNull @Override public IStubElementType getElementType() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassStub.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassStub.java index b47d6620f1c..fa851c5f2e3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassStub.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/PsiJetClassStub.java @@ -34,6 +34,8 @@ public interface PsiJetClassStub extends NamedStub { boolean isAnnotation(); boolean isEnumClass(); + + boolean isInner(); boolean isEnumEntry(); 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 64bd5243a73..3e552048dc1 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 @@ -55,7 +55,7 @@ public class JetClassElementType extends JetStubElementType superNames = stub.getSuperNames(); dataStream.writeVarInt(superNames.size()); @@ -82,6 +83,7 @@ public class JetClassElementType extends JetStubElementType implements PsiJetCla private final boolean isEnumClass; private final boolean isEnumEntry; private final boolean isAnnotation; + private final boolean isInner; public PsiJetClassStubImpl( JetClassElementType type, @@ -45,9 +46,9 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla @Nullable final String qualifiedName, String name, List superNames, - boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation) { + boolean isTrait, boolean isEnumClass, boolean isEnumEntry, boolean isAnnotation, boolean isInner) { this(type, parent, StringRef.fromString(qualifiedName), StringRef.fromString(name), wrapStrings(superNames), - isTrait, isEnumClass, isEnumEntry, isAnnotation); + isTrait, isEnumClass, isEnumEntry, isAnnotation, isInner); } public PsiJetClassStubImpl( @@ -59,7 +60,8 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla boolean isTrait, boolean isEnumClass, boolean isEnumEntry, - boolean isAnnotation) { + boolean isAnnotation, + boolean isInner) { super(parent, type); this.qualifiedName = qualifiedName; this.name = name; @@ -68,6 +70,7 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla this.isEnumClass = isEnumClass; this.isEnumEntry = isEnumEntry; this.isAnnotation = isAnnotation; + this.isInner = isInner; } private static StringRef[] wrapStrings(List names) { @@ -102,6 +105,11 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla public boolean isEnumEntry() { return isEnumEntry; } + + @Override + public boolean isInner() { + return isInner; + } @Override public String getName() { @@ -139,6 +147,10 @@ public class PsiJetClassStubImpl extends StubBase implements PsiJetCla builder.append("isAnnotation "); } + if (isInner()) { + builder.append("inner "); + } + builder.append("name=").append(getName()); builder.append(" fqn=").append(getQualifiedName()); builder.append(" superNames=").append("[").append(StringUtil.join(ArrayUtil.toStringArray(getSuperNames()))).append("]"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java index 37db39f6761..d076ac3b738 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java @@ -144,6 +144,7 @@ public interface JetTokens { JetKeywordToken ABSTRACT_KEYWORD = JetKeywordToken.softKeyword("abstract"); JetKeywordToken ENUM_KEYWORD = JetKeywordToken.softKeyword("enum"); JetKeywordToken OPEN_KEYWORD = JetKeywordToken.softKeyword("open"); + JetKeywordToken INNER_KEYWORD = JetKeywordToken.softKeyword("inner"); JetKeywordToken ANNOTATION_KEYWORD = JetKeywordToken.softKeyword("annotation"); JetKeywordToken OVERRIDE_KEYWORD = JetKeywordToken.softKeyword("override"); JetKeywordToken PRIVATE_KEYWORD = JetKeywordToken.softKeyword("private"); @@ -169,13 +170,13 @@ public interface JetTokens { ); TokenSet SOFT_KEYWORDS = TokenSet.create(IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, - SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ANNOTATION_KEYWORD, + SET_KEYWORD, ABSTRACT_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, INNER_KEYWORD, ANNOTATION_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, CATCH_KEYWORD, FINALLY_KEYWORD, OUT_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, INLINE_KEYWORD, REIFIED_KEYWORD ); TokenSet MODIFIER_KEYWORDS = TokenSet.create(ABSTRACT_KEYWORD, ENUM_KEYWORD, - OPEN_KEYWORD, ANNOTATION_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, + OPEN_KEYWORD, INNER_KEYWORD, ANNOTATION_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, OUT_KEYWORD, IN_KEYWORD, FINAL_KEYWORD, VARARG_KEYWORD, INLINE_KEYWORD, REIFIED_KEYWORD ); TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT, SHEBANG_COMMENT); diff --git a/compiler/testData/psi/Inner.jet b/compiler/testData/psi/Inner.jet new file mode 100644 index 00000000000..361ea44f3c3 --- /dev/null +++ b/compiler/testData/psi/Inner.jet @@ -0,0 +1,3 @@ +class Outer { + inner class Inner +} diff --git a/compiler/testData/psi/Inner.txt b/compiler/testData/psi/Inner.txt new file mode 100644 index 00000000000..9b551a6c180 --- /dev/null +++ b/compiler/testData/psi/Inner.txt @@ -0,0 +1,24 @@ +JetFile: Inner.jet + NAMESPACE_HEADER + + CLASS + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('Outer') + PsiWhiteSpace(' ') + TYPE_PARAMETER_LIST + + CLASS_BODY + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + CLASS + MODIFIER_LIST + PsiElement(inner)('inner') + PsiWhiteSpace(' ') + PsiElement(class)('class') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('Inner') + PsiWhiteSpace('\n') + TYPE_PARAMETER_LIST + + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java index d3bce857cb9..d89eb5ad957 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java @@ -155,6 +155,15 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase { " TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n"); } + public void testInnerClass() { + doBuildTest("class A { inner class B { } }", + "PsiJetFileStubImpl[package=]\n" + + " CLASS:PsiJetClassStubImpl[name=A fqn=A superNames=[]]\n" + + " TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n" + + " CLASS:PsiJetClassStubImpl[inner name=B fqn=A.B superNames=[]]\n" + + " TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n"); + } + public void testNamedObject() { doBuildTest("object Test {}", "PsiJetFileStubImpl[package=]\n" +