Introduce helper method to get stub or psi children as list

Add ArrayFactory to JetStubElement
Remove redundant array factories
This commit is contained in:
Pavel V. Talanov
2014-05-19 18:47:43 +04:00
parent eb27020340
commit 1d3a3aea09
8 changed files with 39 additions and 33 deletions
@@ -26,8 +26,12 @@ import com.intellij.psi.StubBasedPsiElement;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.StubElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementType;
import org.jetbrains.jet.plugin.JetLanguage;
import java.util.Arrays;
import java.util.List;
public class JetElementImplStub<T extends StubElement> extends StubBasedPsiElementBase<T>
implements JetElement, StubBasedPsiElement<T> {
public JetElementImplStub(@NotNull T stub, @NotNull IStubElementType nodeType) {
@@ -82,4 +86,11 @@ public class JetElementImplStub<T extends StubElement> extends StubBasedPsiEleme
public <R, D> R accept(@NotNull JetVisitor<R, D> visitor, D data) {
return visitor.visitJetElement(this, data);
}
@NotNull
protected <PsiT extends JetElementImplStub<?>, StubT extends StubElement> List<PsiT> getStubOrPsiChildrenAsList(
@NotNull JetStubElementType<StubT, PsiT> elementType
) {
return Arrays.asList(getStubOrPsiChildren(elementType, elementType.getArrayFactory()));
}
}
@@ -26,14 +26,6 @@ import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import org.jetbrains.jet.lexer.JetTokens;
public class JetImportDirective extends JetElementImplStub<PsiJetImportDirectiveStub> {
public static final JetImportDirective[] EMPTY_ARRAY = new JetImportDirective[0];
public static final ArrayFactory<JetImportDirective> ARRAY_FACTORY = new ArrayFactory<JetImportDirective>() {
@Override
public JetImportDirective[] create(int count) {
return count == 0 ? EMPTY_ARRAY : new JetImportDirective[count];
}
};
public JetImportDirective(@NotNull ASTNode node) {
super(node);
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.stubs.PsiJetPlaceHolderStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import java.util.Arrays;
import java.util.List;
public class JetImportList extends JetElementImplStub<PsiJetPlaceHolderStub<JetImportList>> {
@@ -41,6 +40,6 @@ public class JetImportList extends JetElementImplStub<PsiJetPlaceHolderStub<JetI
@NotNull
public List<JetImportDirective> getImports() {
return Arrays.asList(getStubOrPsiChildren(JetStubElementTypes.IMPORT_DIRECTIVE, JetImportDirective.ARRAY_FACTORY));
return getStubOrPsiChildrenAsList(JetStubElementTypes.IMPORT_DIRECTIVE);
}
}
@@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.ItemPresentationProviders;
import com.intellij.util.ArrayFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
@@ -28,14 +27,6 @@ import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import org.jetbrains.jet.lexer.JetTokens;
public class JetParameter extends JetNamedDeclarationStub<PsiJetParameterStub> {
public static final JetParameter[] EMPTY_ARRAY = new JetParameter[0];
public static final ArrayFactory<JetParameter> ARRAY_FACTORY = new ArrayFactory<JetParameter>() {
@Override
public JetParameter[] create(int count) {
return count == 0 ? EMPTY_ARRAY : new JetParameter[count];
}
};
public JetParameter(@NotNull ASTNode node) {
super(node);
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.stubs.PsiJetPlaceHolderStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import java.util.Arrays;
import java.util.List;
public class JetParameterList extends JetElementImplStub<PsiJetPlaceHolderStub<JetParameterList>> {
@@ -40,6 +39,6 @@ public class JetParameterList extends JetElementImplStub<PsiJetPlaceHolderStub<J
@NotNull
public List<JetParameter> getParameters() {
return Arrays.asList(getStubOrPsiChildren(JetStubElementTypes.VALUE_PARAMETER, JetParameter.ARRAY_FACTORY));
return getStubOrPsiChildrenAsList(JetStubElementTypes.VALUE_PARAMETER);
}
}
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.util.ArrayFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
@@ -27,14 +26,6 @@ import org.jetbrains.jet.lang.types.Variance;
import org.jetbrains.jet.lexer.JetTokens;
public class JetTypeParameter extends JetNamedDeclarationStub<PsiJetTypeParameterStub> {
public static final JetTypeParameter[] EMPTY_ARRAY = new JetTypeParameter[0];
public static final ArrayFactory<JetTypeParameter> ARRAY_FACTORY = new ArrayFactory<JetTypeParameter>() {
@Override
public JetTypeParameter[] create(int count) {
return count == 0 ? EMPTY_ARRAY : new JetTypeParameter[count];
}
};
public JetTypeParameter(@NotNull ASTNode node) {
super(node);
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.stubs.PsiJetPlaceHolderStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import java.util.Arrays;
import java.util.List;
public class JetTypeParameterList extends JetElementImplStub<PsiJetPlaceHolderStub<JetTypeParameterList>> {
@@ -35,7 +34,7 @@ public class JetTypeParameterList extends JetElementImplStub<PsiJetPlaceHolderSt
@NotNull
public List<JetTypeParameter> getParameters() {
return Arrays.asList(getStubOrPsiChildren(JetStubElementTypes.TYPE_PARAMETER, JetTypeParameter.ARRAY_FACTORY));
return getStubOrPsiChildrenAsList(JetStubElementTypes.TYPE_PARAMETER);
}
@Override
@@ -22,12 +22,14 @@ import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.IndexSink;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.ArrayFactory;
import com.intellij.util.ReflectionUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.plugin.JetLanguage;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
public abstract class JetStubElementType<StubT extends StubElement, PsiT extends JetElementImplStub<?>> extends IStubElementType<StubT, PsiT> {
@@ -36,8 +38,12 @@ public abstract class JetStubElementType<StubT extends StubElement, PsiT extends
private final Constructor<PsiT> byNodeConstructor;
@NotNull
private final Constructor<PsiT> byStubConstructor;
@NotNull
private final PsiT[] emptyArray;
@NotNull
private final ArrayFactory<PsiT> arrayFactory;
public JetStubElementType(@NotNull @NonNls String debugName, @NotNull Class<PsiT> psiClass, @NotNull Class<?> stubClass) {
public JetStubElementType(@NotNull @NonNls String debugName, @NotNull final Class<PsiT> psiClass, @NotNull Class<?> stubClass) {
super(debugName, JetLanguage.INSTANCE);
try {
byNodeConstructor = psiClass.getConstructor(ASTNode.class);
@@ -46,6 +52,19 @@ public abstract class JetStubElementType<StubT extends StubElement, PsiT extends
catch (NoSuchMethodException e) {
throw new RuntimeException("Stub element type declaration for " + psiClass.getSimpleName() + " is missing required constructors",e);
}
//noinspection unchecked
emptyArray = (PsiT[]) Array.newInstance(psiClass, 0);
arrayFactory = new ArrayFactory<PsiT>() {
@NotNull
@Override
public PsiT[] create(int count) {
if (count == 0) {
return emptyArray;
}
//noinspection unchecked
return (PsiT[]) Array.newInstance(psiClass, count);
}
};
}
@NotNull
@@ -107,4 +126,9 @@ public abstract class JetStubElementType<StubT extends StubElement, PsiT extends
public void indexStub(@NotNull StubT stub, @NotNull IndexSink sink) {
// do not force inheritors to implement this method
}
@NotNull
public ArrayFactory<PsiT> getArrayFactory() {
return arrayFactory;
}
}