Refactoring: Use GroovyNamedArgumentProvider instead of GroovyMethodDescriptor.NamedArgumentProvider in <methodDescriptor namedArgsProvider="<caret>" />

This commit is contained in:
Sergey Evdokimov
2011-09-29 17:24:18 +04:00
parent 4a657b3446
commit abc2a7ee71
5 changed files with 36 additions and 37 deletions
@@ -158,8 +158,4 @@ public class GroovyMethodDescriptor {
return descriptor;
}
public interface NamedArgumentProvider {
void collectNamedArguments(Map<String, GroovyNamedArgumentProvider.ArgumentDescriptor> res, @NotNull GrCall callExpression, @NotNull PsiMethod method);
}
}
@@ -4,7 +4,6 @@ import com.intellij.psi.*;
import com.intellij.util.PairFunction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrCall;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder;
@@ -28,7 +27,7 @@ public class GroovyMethodInfo {
private final Map<String, GroovyNamedArgumentProvider.ArgumentDescriptor> myNamedArguments;
private final String myNamedArgProviderClassName;
private GroovyMethodDescriptor.NamedArgumentProvider myNamedArgProviderInstance;
private GroovyNamedArgumentProvider myNamedArgProviderInstance;
private static void ensureInit() {
if (METHOD_INFOS != null) return;
@@ -154,8 +153,8 @@ public class GroovyMethodInfo {
return myReturnType;
}
public String getReturnTypeCalculatorClassName() {
return myReturnTypeCalculatorClassName;
public boolean isReturnTypeCalculatorDefined() {
return myReturnTypeCalculatorClassName != null;
}
@NotNull
@@ -163,25 +162,23 @@ public class GroovyMethodInfo {
if (myReturnTypeCalculatorInstance == null) {
myReturnTypeCalculatorInstance = ClassInstanceCache.getInstance(myReturnTypeCalculatorClassName);
}
return myReturnTypeCalculatorInstance;
}
public void addNamedArguments(Map<String, GroovyNamedArgumentProvider.ArgumentDescriptor> res, @NotNull GrCall call, @NotNull PsiMethod method) {
if (myNamedArguments != null) {
res.putAll(myNamedArguments);
}
else if (myNamedArgProviderClassName != null) {
if (myNamedArgProviderInstance == null) {
myNamedArgProviderInstance = ClassInstanceCache.getInstance(myNamedArgProviderClassName);
}
myNamedArgProviderInstance.collectNamedArguments(res, call, method);
}
@Nullable
public Map<String, GroovyNamedArgumentProvider.ArgumentDescriptor> getNamedArguments() {
return myNamedArguments;
}
public boolean isProvideNamedArguments() {
return myNamedArguments != null || myNamedArgProviderClassName != null;
public boolean isNamedArgumentProviderDefined() {
return myNamedArgProviderClassName != null;
}
public GroovyNamedArgumentProvider getNamedArgProvider() {
if (myNamedArgProviderInstance == null) {
myNamedArgProviderInstance = ClassInstanceCache.getInstance(myNamedArgProviderClassName);
}
return myNamedArgProviderInstance;
}
public boolean isApplicable(@NotNull PsiMethod method) {
@@ -68,6 +68,7 @@ public abstract class GroovyNamedArgumentProvider {
super.put(key, oldValue);
}
//noinspection ConstantConditions
return oldValue;
}
};
@@ -90,7 +91,18 @@ public abstract class GroovyNamedArgumentProvider {
if (!method.isConstructor() && !(parameters.length > 0 && canBeMap(parameters[0]))) continue;
collectVariantsFromSimpleDescriptors(namedArguments, call, method);
for (GroovyMethodInfo methodInfo : GroovyMethodInfo.getInfos(method)) {
if (methodInfo.getNamedArguments() != null) {
if (methodInfo.isApplicable(method)) {
namedArguments.putAll(methodInfo.getNamedArguments());
}
}
else if (methodInfo.isNamedArgumentProviderDefined()) {
if (methodInfo.isApplicable(method)) {
methodInfo.getNamedArgProvider().getNamedArguments(call, element, argumentName, forCompletion, namedArguments);
}
}
}
}
for (GroovyNamedArgumentProvider namedArgumentProvider : EP_NAME.getExtensions()) {
@@ -102,15 +114,6 @@ public abstract class GroovyNamedArgumentProvider {
return namedArguments;
}
private static void collectVariantsFromSimpleDescriptors(Map<String, ArgumentDescriptor> res, @NotNull GrCall call, @NotNull PsiMethod method) {
for (GroovyMethodInfo methodInfo : GroovyMethodInfo.getInfos(method)) {
if (methodInfo.isProvideNamedArguments() && methodInfo.isApplicable(method)) {
methodInfo.addNamedArguments(res, call, method);
break;
}
}
}
public static boolean canBeMap(PsiParameter parameter) {
if (parameter instanceof GrParameter) {
if (((GrParameter)parameter).getTypeElementGroovy() == null) return true;
@@ -31,10 +31,12 @@ public class GrDescriptorReturnTypeCalculator extends GrCallExpressionTypeCalcul
}
}
else {
if (methodInfo.getReturnTypeCalculatorClassName() != null && methodInfo.isApplicable(method)) {
PsiType result = methodInfo.getReturnTypeCalculator().fun(callExpression, method);
if (result != null) {
return result;
if (methodInfo.isReturnTypeCalculatorDefined()) {
if (methodInfo.isApplicable(method)) {
PsiType result = methodInfo.getReturnTypeCalculator().fun(callExpression, method);
if (result != null) {
return result;
}
}
}
}
@@ -1,6 +1,7 @@
package org.jetbrains.plugins.groovy.util;
import com.intellij.util.containers.ConcurrentHashMap;
import org.jetbrains.annotations.NotNull;
/**
* @author Sergey Evdokimov
@@ -13,7 +14,7 @@ public class ClassInstanceCache {
}
@SuppressWarnings("unchecked")
public static <T> T getInstance(String className) {
public static <T> T getInstance(@NotNull String className) {
Object res = CACHE.get(className);
if (res != null) return (T)res;