/* * Copyright 2000-2009 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 com.intellij.psi; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.impl.source.resolve.ParameterTypeInferencePolicy; import com.intellij.psi.infos.CandidateInfo; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Service for resolving references to declarations. * * @see JavaPsiFacade#getResolveHelper() */ public interface PsiResolveHelper { RecursionGuard ourGuard = RecursionManager.createGuard("typeArgInference"); RecursionGuard ourGraphGuard = RecursionManager.createGuard("graphTypeArgInference"); class SERVICE { private SERVICE() { } public static PsiResolveHelper getInstance(Project project) { return ServiceManager.getService(project, PsiResolveHelper.class); } } /** * Resolves a constructor. * The resolved constructor is not necessarily accessible from the point of the call, * but accessible constructors have a priority. * * @param type the class containing the constructor * @param argumentList list of arguments of the call or new expression * @param place place where constructor is invoked (used for checking access) * @return the result of the resolve, or {@link JavaResolveResult#EMPTY} if the resolve failed. */ @NotNull JavaResolveResult resolveConstructor(PsiClassType type, PsiExpressionList argumentList, PsiElement place); /** * Resolves a constructor and returns all variants for the resolve. * The resolved constructors are not necessarily accessible from the point of the call, * but accessible constructors have a priority. * * @param type the class containing the constructor * @param argumentList list of arguments of the call or new expression * @param place place where constructor is invoked (used for checking access) * @return the result of the resolve, or {@link JavaResolveResult#EMPTY} if the resolve failed. */ @NotNull JavaResolveResult[] multiResolveConstructor(@NotNull PsiClassType type, @NotNull PsiExpressionList argumentList, @NotNull PsiElement place); /** * Resolves a call expression and returns an array of possible resolve results. * * @param call the call expression to resolve. * @param dummyImplicitConstructor if true, implicit empty constructor which does not actually exist * can be returned as a candidate for the resolve. * @return the array of resolve results. */ @NotNull CandidateInfo[] getReferencedMethodCandidates(@NotNull PsiCallExpression call, boolean dummyImplicitConstructor); /** * Resolves a reference to a class, given the text of the reference and the context * in which it was encountered. * * @param referenceText the text of the reference. * @param context the context in which the reference is found. * @return the resolve result, or null if the resolve was not successful. */ @Nullable PsiClass resolveReferencedClass(@NotNull String referenceText, PsiElement context); /** * Resolves a reference to a variable, given the text of the reference and the context * in which it was encountered. * * @param referenceText the text of the reference. * @param context the context in which the reference is found. * @return the resolve result, or null if the resolve was not successful. */ @Nullable PsiVariable resolveReferencedVariable(@NotNull String referenceText, PsiElement context); /** * Resolves a reference to a variable, given the text of the reference and the context * in which it was encountered. * * @param referenceText the text of the reference. * @param context the context in which the reference is found. * @return the resolve result, or null if the resolve was not successful or resolved variable is not accessible in a given context. */ @Nullable PsiVariable resolveAccessibleReferencedVariable(@NotNull String referenceText, PsiElement context); boolean isAccessible(@NotNull PsiMember member, @Nullable PsiModifierList modifierList, @NotNull PsiElement place, @Nullable PsiClass accessObjectClass, @Nullable PsiElement currentFileResolveScope); boolean isAccessible(@NotNull PsiMember member, @NotNull PsiElement place, @Nullable PsiClass accessObjectClass); /** * @return {@link PsiType#NULL} iff no type could be inferred * null iff the type inferred is raw * inferred type otherwise */ PsiType inferTypeForMethodTypeParameter(@NotNull PsiTypeParameter typeParameter, @NotNull PsiParameter[] parameters, @NotNull PsiExpression[] arguments, @NotNull PsiSubstitutor partialSubstitutor, @Nullable PsiElement parent, @NotNull ParameterTypeInferencePolicy policy); @NotNull PsiSubstitutor inferTypeArguments(@NotNull PsiTypeParameter[] typeParameters, @NotNull PsiParameter[] parameters, @NotNull PsiExpression[] arguments, @NotNull PsiSubstitutor partialSubstitutor, @NotNull PsiElement parent, @NotNull ParameterTypeInferencePolicy policy); @NotNull PsiSubstitutor inferTypeArguments(@NotNull PsiTypeParameter[] typeParameters, @NotNull PsiParameter[] parameters, @NotNull PsiExpression[] arguments, @NotNull PsiSubstitutor partialSubstitutor, @NotNull PsiElement parent, @NotNull ParameterTypeInferencePolicy policy, @NotNull LanguageLevel languageLevel); @NotNull PsiSubstitutor inferTypeArguments(@NotNull PsiTypeParameter[] typeParameters, @NotNull PsiType[] leftTypes, @NotNull PsiType[] rightTypes, @NotNull LanguageLevel languageLevel); PsiType getSubstitutionForTypeParameter(PsiTypeParameter typeParam, PsiType param, PsiType arg, boolean isContraVariantPosition, LanguageLevel languageLevel); }