import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.MethodSignatureUtil;
-import gnu.trove.THashMap;
+import com.intellij.util.containers.MultiMap;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureParameter;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrClosureSignature;
//check for default constructor
if (method.isConstructor() && method.getParameterList().getParametersCount() == 0 && argumentTypes.length == 1) {
- final PsiType type = argumentTypes[0];
- final PsiClassType mapType = JavaPsiFacade.getElementFactory(method.getProject())
- .createTypeByFQClassName(CommonClassNames.JAVA_UTIL_MAP, method.getResolveScope());
- return TypesUtil.isAssignable(mapType, type, place);
+ return InheritanceUtil.isInheritor(argumentTypes[0], CommonClassNames.JAVA_UTIL_MAP);
}
LOG.assertTrue(signature != null);
- return GrClosureSignatureUtil.isSignatureApplicable(signature, argumentTypes, method.getManager(), method.getResolveScope());
+ return GrClosureSignatureUtil.isSignatureApplicable(signature, argumentTypes, place);
}
- public static boolean isApplicable(@Nullable PsiType[] argumentTypes, GrClosureType type, PsiManager manager) {
+ public static boolean isApplicable(@Nullable PsiType[] argumentTypes, GrClosureType type, GroovyPsiElement context) {
if (argumentTypes == null) return true;
GrClosureSignature signature = type.getSignature();
}
}
+ public static boolean isMethodUsage(PsiElement element) {
+ if (element instanceof GrEnumConstant) return true;
+ if (!(element instanceof GrReferenceElement)) return false;
+ PsiElement parent = element.getParent();
+ if (parent instanceof GrCall) {
+ return true;
+ }
+ else if (parent instanceof GrAnonymousClassDefinition) {
+ return element.equals(((GrAnonymousClassDefinition)parent).getBaseClassReferenceGroovy());
+ }
+ return false;
+ }
++
+ public static GroovyResolveResult[] getConstructorCandidates(GroovyPsiElement place, GroovyResolveResult[] classCandidates, PsiType[] argTypes) {
+ List<GroovyResolveResult> constructorResults = new ArrayList<GroovyResolveResult>();
+ for (GroovyResolveResult classResult : classCandidates) {
+ final PsiElement element = classResult.getElement();
+ if (element instanceof PsiClass) {
+ final GroovyPsiElement context = classResult.getCurrentFileResolveContext();
+ PsiClass clazz = (PsiClass)element;
+ String className = clazz.getName();
+ PsiType thisType = JavaPsiFacade.getInstance(place.getProject()).getElementFactory().createType(clazz, classResult.getSubstitutor());
+ final MethodResolverProcessor processor = new MethodResolverProcessor(className, place, true, thisType, argTypes, PsiType.EMPTY_ARRAY)
+ ;
+ processor.setCurrentFileResolveContext(context);
+ PsiSubstitutor substitutor = classResult.getSubstitutor();
+ final boolean toBreak =
+ element.processDeclarations(processor, ResolveState.initial().put(PsiSubstitutor.KEY, substitutor), null, place);
+
+ for (NonCodeMembersProcessor membersProcessor : NonCodeMembersProcessor.EP_NAME.getExtensions()) {
+ if (!membersProcessor.processNonCodeMembers(thisType, processor, place, true)) break;
+ }
+ constructorResults.addAll(Arrays.asList(processor.getCandidates()));
+ if (!toBreak) break;
+ }
+ }
+
+ return constructorResults.toArray(new GroovyResolveResult[constructorResults.size()]);
+ }
}