From 7ce982118978323059c49ba9888a237ef9d4dfe3 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 20 Dec 2011 18:21:22 +0100 Subject: [PATCH] correct containingClass and other properties of stub-based groovy enum constants (EA-31346) --- .../lang/parser/GroovyElementTypes.java | 17 ++++++-- .../typedef/GrEnumDefinitionBody.java | 2 + .../typedef/members/GrEnumConstant.java | 7 +++ .../typedef/GrEnumTypeDefinitionImpl.java | 2 +- .../typedef/GrTypeDefinitionBodyBase.java | 9 +++- .../enumConstant/GrEnumConstantListImpl.java | 22 ++++++++-- .../stubs/elements/GrStubFileElementType.java | 2 +- .../groovy/lang/GroovyStubsTest.groovy | 43 +++++++++++++++++++ 8 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyStubsTest.groovy diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java index 45a1ce9622d3..e1d73e4cc191 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/GroovyElementTypes.java @@ -34,6 +34,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.*; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstantList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeParameter; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeParameterList; @@ -45,6 +46,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.statements.blocks.GrOpenBlockI import org.jetbrains.plugins.groovy.lang.psi.impl.statements.params.GrParameterImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.params.GrParameterListImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.*; +import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.enumConstant.GrEnumConstantListImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members.GrAnnotationMethodImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members.GrConstructorImpl; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.members.GrMethodImpl; @@ -176,8 +178,12 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy GroovyElementType BLOCK_STATEMENT = new GroovyElementType("Block statement"); - // Enum - GroovyElementType ENUM_CONSTANTS = new GroovyElementType("Enumeration constants"); + EmptyStubElementType ENUM_CONSTANTS = new EmptyStubElementType("Enumeration constants", GroovyFileType.GROOVY_LANGUAGE) { + @Override + public GrEnumConstantList createPsi(@NotNull EmptyStub stub) { + return new GrEnumConstantListImpl(stub); + } + }; GroovyElementType IMPORT_STATEMENT = new GroovyElementType("Import statement"); //Branch statements GroovyElementType BREAK_STATEMENT = new GroovyElementType("Break statement"); @@ -374,7 +380,12 @@ public interface GroovyElementTypes extends GroovyTokenTypes, GroovyDocElementTy } }; - IElementType ENUM_BODY = new GroovyElementType("enum block"); + EmptyStubElementType ENUM_BODY = new EmptyStubElementType("enum block", GroovyFileType.GROOVY_LANGUAGE) { + @Override + public GrEnumDefinitionBody createPsi(@NotNull EmptyStub stub) { + return new GrTypeDefinitionBodyBase.GrEnumBody(stub); + } + }; //statements GroovyElementType IF_STATEMENT = new GroovyElementType("if statement"); GroovyElementType FOR_STATEMENT = new GroovyElementType("for statement"); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/GrEnumDefinitionBody.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/GrEnumDefinitionBody.java index 76602400da06..c8c3146829a9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/GrEnumDefinitionBody.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/GrEnumDefinitionBody.java @@ -15,11 +15,13 @@ */ package org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstantList; /** * @author ven */ public interface GrEnumDefinitionBody extends GrTypeDefinitionBody { + @Nullable GrEnumConstantList getEnumConstantList(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java index 06a6cbad32c0..e87d5d5d5d04 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/typedef/members/GrEnumConstant.java @@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members; import com.intellij.psi.PsiEnumConstant; +import com.intellij.util.ArrayFactory; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; @@ -29,6 +30,12 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrEnumConsta */ public interface GrEnumConstant extends GrField, GrConstructorCall, PsiEnumConstant { GrEnumConstant[] EMPTY_ARRAY = new GrEnumConstant[0]; + ArrayFactory ARRAY_FACTORY = new ArrayFactory() { + @Override + public GrEnumConstant[] create(int count) { + return new GrEnumConstant[count]; + } + }; @Nullable GrEnumConstantInitializer getInitializingClass(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrEnumTypeDefinitionImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrEnumTypeDefinitionImpl.java index eefe0cdf1e13..42308ec1959b 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrEnumTypeDefinitionImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrEnumTypeDefinitionImpl.java @@ -66,7 +66,7 @@ public class GrEnumTypeDefinitionImpl extends GrTypeDefinitionImpl implements Gr } public GrEnumDefinitionBody getBody() { - return (GrEnumDefinitionBody)findChildByType(GroovyElementTypes.ENUM_BODY); + return getStubOrPsiChild(GroovyElementTypes.ENUM_BODY); } public boolean isEnum() { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionBodyBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionBodyBase.java index 56cd0a9b72cc..8f25096c52d1 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionBodyBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionBodyBase.java @@ -173,13 +173,18 @@ public abstract class GrTypeDefinitionBodyBase extends GrStubElementBase { public GrEnumBody(@NotNull ASTNode node) { super(node); } + public GrEnumBody(EmptyStub stub) { + super(stub, GroovyElementTypes.ENUM_BODY); + } + + @Nullable public GrEnumConstantList getEnumConstantList() { - return findChildByClass(GrEnumConstantList.class); + return getStubOrPsiChild(GroovyElementTypes.ENUM_CONSTANTS); } public void accept(GroovyElementVisitor visitor) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantListImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantListImpl.java index 115245a45f39..9d379c3c843d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantListImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/enumConstant/GrEnumConstantListImpl.java @@ -17,21 +17,30 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements.typedef.enumConstant; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.StubBasedPsiElement; +import com.intellij.psi.stubs.EmptyStub; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstantList; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; -import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiElementImpl; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstantList; +import org.jetbrains.plugins.groovy.lang.psi.impl.GrStubElementBase; /** * @author: Dmitry.Krasilschikov * @date: 06.04.2007 */ -public class GrEnumConstantListImpl extends GroovyPsiElementImpl implements GrEnumConstantList { +public class GrEnumConstantListImpl extends GrStubElementBase implements GrEnumConstantList, StubBasedPsiElement { + public GrEnumConstantListImpl(@NotNull ASTNode node) { super(node); } + public GrEnumConstantListImpl(EmptyStub stub) { + super(stub, GroovyElementTypes.ENUM_CONSTANTS); + } + public void accept(GroovyElementVisitor visitor) { visitor.visitEnumConstants(this); } @@ -41,6 +50,11 @@ public class GrEnumConstantListImpl extends GroovyPsiElementImpl implements GrEn } public GrEnumConstant[] getEnumConstants() { - return findChildrenByClass(GrEnumConstant.class); + return getStubOrPsiChildren(GroovyElementTypes.ENUM_CONSTANT, GrEnumConstant.ARRAY_FACTORY); + } + + @Override + public PsiElement getParent() { + return getParentByStub(); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java index ea0e80abeea8..1fd9a185609d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/stubs/elements/GrStubFileElementType.java @@ -54,7 +54,7 @@ public class GrStubFileElementType extends IStubFileElementType { @Override public int getStubVersion() { - return super.getStubVersion() + 10; + return super.getStubVersion() + 11; } public String getExternalId() { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyStubsTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyStubsTest.groovy new file mode 100644 index 000000000000..504671b77f43 --- /dev/null +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyStubsTest.groovy @@ -0,0 +1,43 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.groovy.lang + +import com.intellij.psi.impl.source.PsiFileImpl +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.search.PsiShortNamesCache +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrEnumDefinitionBody + +/** + * @author peter + */ +class GroovyStubsTest extends LightCodeInsightFixtureTestCase { + + public void testEnumConstant() { + myFixture.tempDirFixture.createFile('A.groovy', 'enum A { MyEnumConstant }') + GrEnumConstant ec = (GrEnumConstant)PsiShortNamesCache.getInstance(project).getFieldsByName("MyEnumConstant", GlobalSearchScope.allScope(project))[0] + def file = (PsiFileImpl)ec.containingFile + assert file.stub + assert ec.containingClass.qualifiedName == 'A' + assert file.stub + + assert ec in ec.containingClass.fields + assert ec in ((GrEnumDefinitionBody)((GrTypeDefinition)ec.containingClass).body).enumConstantList.enumConstants + assert file.stub + } +}