diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaElementCollectionFromPsiArrayUtil.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaElementCollectionFromPsiArrayUtil.java index 32cd7f039aa..0561ff4a96d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaElementCollectionFromPsiArrayUtil.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/structure/impl/JavaElementCollectionFromPsiArrayUtil.java @@ -24,122 +24,177 @@ import org.jetbrains.jet.lang.resolve.name.Name; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.List; +@SuppressWarnings("unchecked") public class JavaElementCollectionFromPsiArrayUtil { private JavaElementCollectionFromPsiArrayUtil() { } + private interface Factory { + @NotNull + Java create(@NotNull Psi psi); + } + + private static class Factories { + private static final Factory CLASSES = new Factory() { + @NotNull + @Override + public JavaClassImpl create(@NotNull PsiClass psiClass) { + return new JavaClassImpl(psiClass); + } + }; + + private static final Factory PACKAGES = new Factory() { + @NotNull + @Override + public JavaPackageImpl create(@NotNull PsiPackage psiPackage) { + return new JavaPackageImpl(psiPackage); + } + }; + + private static final Factory METHODS = new Factory() { + @NotNull + @Override + public JavaMethodImpl create(@NotNull PsiMethod psiMethod) { + return new JavaMethodImpl(psiMethod); + } + }; + + private static final Factory FIELDS = new Factory() { + @NotNull + @Override + public JavaFieldImpl create(@NotNull PsiField psiField) { + return new JavaFieldImpl(psiField); + } + }; + + private static final Factory VALUE_PARAMETERS = + new Factory() { + @NotNull + @Override + public JavaValueParameterImpl create(@NotNull PsiParameter psiParameter) { + return new JavaValueParameterImpl(psiParameter); + } + }; + + private static final Factory TYPE_PARAMETERS = + new Factory() { + @NotNull + @Override + public JavaTypeParameterImpl create(@NotNull PsiTypeParameter psiTypeParameter) { + return new JavaTypeParameterImpl(psiTypeParameter); + } + }; + + private static final Factory> TYPES = new Factory>() { + @NotNull + @Override + public JavaTypeImpl create(@NotNull PsiType psiType) { + return JavaTypeImpl.create(psiType); + } + }; + + private static final Factory CLASSIFIER_TYPES = + new Factory() { + @NotNull + @Override + public JavaClassifierTypeImpl create(@NotNull PsiClassType psiClassType) { + return new JavaClassifierTypeImpl(psiClassType); + } + }; + + private static final Factory ANNOTATIONS = new Factory() { + @NotNull + @Override + public JavaAnnotationImpl create(@NotNull PsiAnnotation psiAnnotation) { + return new JavaAnnotationImpl(psiAnnotation); + } + }; + + private static final Factory NAMELESS_ANNOTATION_ARGUMENTS = + new Factory() { + @NotNull + @Override + public JavaAnnotationArgument create(@NotNull PsiAnnotationMemberValue psiAnnotationMemberValue) { + return JavaAnnotationArgumentImpl.create(psiAnnotationMemberValue, null); + } + }; + + private static final Factory NAMED_ANNOTATION_ARGUMENTS = + new Factory() { + @NotNull + @Override + public JavaAnnotationArgument create(@NotNull PsiNameValuePair psiNameValuePair) { + String name = psiNameValuePair.getName(); + PsiAnnotationMemberValue value = psiNameValuePair.getValue(); + assert value != null : "Annotation argument value cannot be null: " + name; + return JavaAnnotationArgumentImpl.create(value, name == null ? null : Name.identifier(name)); + } + }; + } + @NotNull - public static Collection classes(@NotNull PsiClass[] classes) { - if (classes.length == 0) return Collections.emptyList(); - List result = new ArrayList(classes.length); - for (PsiClass psiClass : classes) { - result.add(new JavaClassImpl(psiClass)); + private static Collection convert(@NotNull Psi[] elements, @NotNull Factory factory) { + if (elements.length == 0) return Collections.emptyList(); + Collection result = new ArrayList(elements.length); + for (Psi element : elements) { + result.add(factory.create(element)); } return result; } + @NotNull + public static Collection classes(@NotNull PsiClass[] classes) { + return (Collection) convert(classes, Factories.CLASSES); + } + @NotNull public static Collection packages(@NotNull PsiPackage[] packages) { - if (packages.length == 0) return Collections.emptyList(); - List result = new ArrayList(packages.length); - for (PsiPackage psiPackage : packages) { - result.add(new JavaPackageImpl(psiPackage)); - } - return result; + return (Collection) convert(packages, Factories.PACKAGES); } @NotNull public static Collection methods(@NotNull PsiMethod[] methods) { - if (methods.length == 0) return Collections.emptyList(); - List result = new ArrayList(methods.length); - for (PsiMethod psiMethod : methods) { - result.add(new JavaMethodImpl(psiMethod)); - } - return result; + return (Collection) convert(methods, Factories.METHODS); } @NotNull public static Collection fields(@NotNull PsiField[] fields) { - if (fields.length == 0) return Collections.emptyList(); - List result = new ArrayList(fields.length); - for (PsiField psiField : fields) { - result.add(new JavaFieldImpl(psiField)); - } - return result; + return (Collection) convert(fields, Factories.FIELDS); } @NotNull public static Collection valueParameters(@NotNull PsiParameter[] parameters) { - if (parameters.length == 0) return Collections.emptyList(); - List result = new ArrayList(parameters.length); - for (PsiParameter psiParameter : parameters) { - result.add(new JavaValueParameterImpl(psiParameter)); - } - return result; + return (Collection) convert(parameters, Factories.VALUE_PARAMETERS); } @NotNull public static Collection typeParameters(@NotNull PsiTypeParameter[] typeParameters) { - if (typeParameters.length == 0) return Collections.emptyList(); - List result = new ArrayList(typeParameters.length); - for (PsiTypeParameter psiTypeParameter : typeParameters) { - result.add(new JavaTypeParameterImpl(psiTypeParameter)); - } - return result; + return (Collection) convert(typeParameters, Factories.TYPE_PARAMETERS); } @NotNull public static Collection types(@NotNull PsiType[] types) { - if (types.length == 0) return Collections.emptyList(); - List result = new ArrayList(types.length); - for (PsiType psiType : types) { - result.add(JavaTypeImpl.create(psiType)); - } - return result; + return (Collection) convert(types, Factories.TYPES); } @NotNull public static Collection classifierTypes(@NotNull PsiClassType[] classTypes) { - if (classTypes.length == 0) return Collections.emptyList(); - List result = new ArrayList(classTypes.length); - for (PsiClassType psiClassType : classTypes) { - result.add(new JavaClassifierTypeImpl(psiClassType)); - } - return result; + return (Collection) convert(classTypes, Factories.CLASSIFIER_TYPES); } @NotNull public static Collection annotations(@NotNull PsiAnnotation[] annotations) { - if (annotations.length == 0) return Collections.emptyList(); - List result = new ArrayList(annotations.length); - for (PsiAnnotation psiAnnotation : annotations) { - result.add(new JavaAnnotationImpl(psiAnnotation)); - } - return result; + return (Collection) convert(annotations, Factories.ANNOTATIONS); } @NotNull public static Collection namelessAnnotationArguments(@NotNull PsiAnnotationMemberValue[] memberValues) { - if (memberValues.length == 0) return Collections.emptyList(); - List result = new ArrayList(memberValues.length); - for (PsiAnnotationMemberValue psiAnnotationMemberValue : memberValues) { - result.add(JavaAnnotationArgumentImpl.create(psiAnnotationMemberValue, null)); - } - return result; + return (Collection) convert(memberValues, Factories.NAMELESS_ANNOTATION_ARGUMENTS); } @NotNull public static Collection namedAnnotationArguments(@NotNull PsiNameValuePair[] nameValuePairs) { - if (nameValuePairs.length == 0) return Collections.emptyList(); - List result = new ArrayList(nameValuePairs.length); - for (PsiNameValuePair pair : nameValuePairs) { - String name = pair.getName(); - PsiAnnotationMemberValue value = pair.getValue(); - assert value != null : "Annotation argument value cannot be null: " + name; - result.add(JavaAnnotationArgumentImpl.create(value, name == null ? null : Name.identifier(name))); - } - return result; + return (Collection) convert(nameValuePairs, Factories.NAMED_ANNOTATION_ARGUMENTS); } }