From abc2a7ee71a8890e93d1017888b7d8bf6c732528 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Thu, 29 Sep 2011 17:13:11 +0400 Subject: [PATCH] Refactoring: Use GroovyNamedArgumentProvider instead of GroovyMethodDescriptor.NamedArgumentProvider in --- .../extensions/GroovyMethodDescriptor.java | 4 --- .../groovy/extensions/GroovyMethodInfo.java | 33 +++++++++---------- .../GroovyNamedArgumentProvider.java | 23 +++++++------ .../GrDescriptorReturnTypeCalculator.java | 10 +++--- .../groovy/util/ClassInstanceCache.java | 3 +- 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java index 1fece6a4e024..d2b2b2338f1a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodDescriptor.java @@ -158,8 +158,4 @@ public class GroovyMethodDescriptor { return descriptor; } - - public interface NamedArgumentProvider { - void collectNamedArguments(Map res, @NotNull GrCall callExpression, @NotNull PsiMethod method); - } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java index 52b2cbec549d..8517fce096de 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyMethodInfo.java @@ -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 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 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 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) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyNamedArgumentProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyNamedArgumentProvider.java index 942a36c2c2a2..89c85fb50482 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyNamedArgumentProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/extensions/GroovyNamedArgumentProvider.java @@ -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 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; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrDescriptorReturnTypeCalculator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrDescriptorReturnTypeCalculator.java index 6779220fc5e2..92862d15a748 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrDescriptorReturnTypeCalculator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/expressions/path/GrDescriptorReturnTypeCalculator.java @@ -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; + } } } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java index b81c56f2ebd9..22d4893c1d56 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/util/ClassInstanceCache.java @@ -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 getInstance(String className) { + public static T getInstance(@NotNull String className) { Object res = CACHE.get(className); if (res != null) return (T)res;