mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Refactoring: Use GroovyNamedArgumentProvider instead of GroovyMethodDescriptor.NamedArgumentProvider in <methodDescriptor namedArgsProvider="<caret>" />
This commit is contained in:
@@ -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) {
|
||||
|
||||
+13
-10
@@ -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;
|
||||
|
||||
+6
-4
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user