/** * Returns set of endpoint injected types. * * @param project The current project. * @return Set of injected types. */ private static Set<PsiClassType> createInjectedClassTypes(Project project) { Set<PsiClassType> injectedClassTypes = new HashSet<PsiClassType>(); injectedClassTypes.add( JavaPsiFacade.getElementFactory(project) .createTypeByFQClassName("com.google.appengine.api.users.User")); injectedClassTypes.add( JavaPsiFacade.getElementFactory(project) .createTypeByFQClassName("javax.servlet.http.HttpServletRequest")); injectedClassTypes.add( JavaPsiFacade.getElementFactory(project) .createTypeByFQClassName("javax.servlet.ServletContext")); return Collections.unmodifiableSet(injectedClassTypes); }
Set<PsiClassType> parameterTypes = new HashSet<PsiClassType>(); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.lang.Enum")); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.lang.String")); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.lang.Boolean")); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.lang.Integer")); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.lang.Long")); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.lang.Float")); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.lang.Double")); parameterTypes.add( JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.util.Date")); parameterTypes.add( JavaPsiFacade.getElementFactory(project) .createTypeByFQClassName("com.google.api.server.spi.types.DateAndTime")); parameterTypes.add( JavaPsiFacade.getElementFactory(project) .createTypeByFQClassName("com.google.api.server.spi.types.SimpleDate"));
/** * Returns the class type for qualified class name. * * @param qName qualified class name. * @param project * @param resolveScope the scope in which the class is searched. * @return the class instance. */ public static PsiClassType getTypeByName(String qName, Project project, GlobalSearchScope resolveScope) { PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); return factory.createTypeByFQClassName(qName, resolveScope); }
/** * Returns false is <code>type</code> is an array or a java.util.Collection or one of its * subtypes. Returns true otherwise. * * @param type The PsiType been validated. * @param project The project that has the PsiElement associated with <code>type</code>. */ public boolean isValidInnerArrayType(PsiType type, Project project) { if (type instanceof PsiArrayType) { return false; } // Check if type is a Collection PsiClassType collectionType = JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.util.Collection"); if (collectionType.isAssignableFrom(type)) { return false; } return true; }
private boolean isValidCollectionType(Project project, PsiType type) { // Check if type is a Collection if (PsiUtils.isParameterizedType(type)) { PsiClassType collectionType = JavaPsiFacade.getElementFactory(project) .createTypeByFQClassName("java.util.Collection"); PsiClassType collectionResponseType = JavaPsiFacade.getElementFactory(project) .createTypeByFQClassName("com.google.api.server.spi.response.CollectionResponse"); return collectionType.isAssignableFrom(type) || collectionResponseType.isAssignableFrom(type); } return false; } },
private boolean isCollectionType(PsiType type, Project project) { PsiClassType collectionType = JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.util.Collection"); if (collectionType.isAssignableFrom(type)) { return true; } // hack because isAssignableFrom is broken // todo(elharo): cover other collection types and non-generic collections // todo(elharo): better regex on Java class names String name = type.getCanonicalText(); if (name.matches("List<.+>")) { return true; } return false; } }
@Nullable private static String getSimpleName(Project project, PsiType type) { PsiClassType collectionType = JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.util.Collection"); if (type == null) { return null; } else if (type instanceof PsiArrayType) { PsiType arrayComponentType = ((PsiArrayType) type).getComponentType(); return getSimpleName(project, arrayComponentType) + "collection"; } else if (collectionType.isAssignableFrom(type)) { assert (type instanceof PsiClassType); PsiClassType classType = (PsiClassType) type; PsiType[] typeParams = classType.getParameters(); return typeParams.length > 0 ? getSimpleName(project, typeParams[0]) + "collection" : null; } else if (PsiUtils.isParameterizedType(type)) { assert (type instanceof PsiClassType); StringBuilder builder = new StringBuilder(); PsiClassType classType = (PsiClassType) type; builder.append(getSimpleName(project, classType.rawType())); PsiType[] typeParams = classType.getParameters(); for (PsiType psiType : typeParams) { builder.append('_'); builder.append(getSimpleName(project, psiType)); } return builder.toString(); } else { return type.getPresentableText(); } } }
/** * @return true if the raw or base type of <code>psiType</code> is one of the endpoint parameter * types. */ public boolean isApiParameter(PsiType psiType, Project project) { PsiType baseType = psiType; PsiClassType collectionType = JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.util.Collection"); // If type is an array or collection, get the component type if (psiType instanceof PsiArrayType) { PsiArrayType arrayType = (PsiArrayType) psiType; baseType = arrayType.getDeepComponentType(); } else if (collectionType.isAssignableFrom(psiType)) { assert (psiType instanceof PsiClassType); PsiClassType classType = (PsiClassType) psiType; PsiType[] parameters = classType.getParameters(); if (parameters.length == 0) { return false; } baseType = parameters[0]; } Set<PsiClassType> parameterTypes = createParameterTypes(project); for (PsiClassType classType : parameterTypes) { if (classType.isAssignableFrom(baseType)) { return true; } } return false; }
/** * Returns false if <code>type</code> is a multiple levels of collections or arrays. Returns true * otherwise. * * @param type The PsiType been validated. * @param project The project that has the PsiElement associated with <code>type</code>. */ public boolean isValidArrayOrPrimitiveType(PsiType type, Project project) { if (type instanceof PsiArrayType) { PsiArrayType arrayType = (PsiArrayType) type; if (arrayType.getComponentType() instanceof PsiPrimitiveType) { return true; } else { return isValidInnerArrayType(arrayType.getComponentType(), project); } } // Check if type is a Collection PsiClassType collectionType = JavaPsiFacade.getElementFactory(project).createTypeByFQClassName("java.util.Collection"); if (collectionType.isAssignableFrom(type)) { assert (type instanceof PsiClassType); PsiClassType classType = (PsiClassType) type; PsiType[] typeParams = classType.getParameters(); assert (typeParams.length > 0); return isValidInnerArrayType(typeParams[0], project); } return true; }
final PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory(); final GlobalSearchScope resolveScope = GlobalSearchScope.allScope(manager.getProject()); final PsiClassType cloneable = factory.createTypeByFQClassName(CommonClassNames.JAVA_LANG_CLONEABLE, resolveScope); final PsiClassType serializable = factory.createTypeByFQClassName(CommonClassNames.JAVA_IO_SERIALIZABLE, resolveScope); return PsiIntersectionType.createIntersection(componentType, cloneable, serializable); PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory(); GlobalSearchScope all = GlobalSearchScope.allScope(manager.getProject()); PsiClassType serializable = factory.createTypeByFQClassName(CommonClassNames.JAVA_IO_SERIALIZABLE, all); PsiClassType cloneable = factory.createTypeByFQClassName(CommonClassNames.JAVA_LANG_CLONEABLE, all); PsiType arraySupers = PsiIntersectionType.createIntersection(serializable, cloneable); return getLeastUpperBound(arraySupers, type2, compared, manager);