import org.jetbrains.plugins.groovy.lang.psi.dataFlow.types.TypeInferenceHelper;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.auxiliary.modifiers.GrAnnotationCollector;
-import org.jetbrains.plugins.groovy.lang.psi.impl.signatures.GrClosureSignatureUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
-import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil;
-import org.jetbrains.plugins.groovy.lang.psi.util.GrTraitUtil;
-import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils;
+import org.jetbrains.plugins.groovy.lang.psi.util.*;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
- import org.jetbrains.plugins.groovy.lang.resolve.ast.GrInheritConstructorContributor;
+ import org.jetbrains.plugins.groovy.lang.resolve.ast.InheritConstructorContributor;
import java.util.*;
});
}
+ @NotNull
+ public static Map<PsiMethod, MethodSignature> getDuplicatedMethods(@NotNull PsiClass clazz) {
+ return CachedValuesManager.getCachedValue(clazz, () -> {
+ PsiElementFactory factory = JavaPsiFacade.getInstance(clazz.getProject()).getElementFactory();
+
+ MostlySingularMultiMap<MethodSignature, PsiMethod> signatures = MostlySingularMultiMap.newMap();
+ for (PsiMethod method : clazz.getMethods()) {
+ MethodSignature signature = method.getSignature(factory.createRawSubstitutor(method));
+ signatures.add(signature, method);
+ }
+
+ Map<PsiMethod, MethodSignature> result = ContainerUtil.newHashMap();
+ for (MethodSignature signature : signatures.keySet()) {
+ if (signatures.valuesForKey(signature) > 1) {
+ signatures.processForKey(signature, m -> {
+ result.put(m, signature);
+ return true;
+ });
+ }
+ }
+
+ return CachedValueProvider.Result.create(result, clazz);
+ });
+ }
++
+ public static GrAccessorMethod findSetter(GrField field) {
+ return CachedValuesManager.getCachedValue(field, () -> CachedValueProvider.Result.create(
+ doGetSetter(field), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
+ ));
+ }
+
+ @Nullable
+ private static GrAccessorMethod doGetSetter(GrField field) {
+ PsiClass containingClass = field.getContainingClass();
+ if (containingClass == null) return null;
+ PsiMethod[] setters = containingClass.findMethodsByName(GroovyPropertyUtils.getSetterName(field.getName()), false);
+ for (PsiMethod setter : setters) {
+ if (setter instanceof GrAccessorMethod) {
+ return (GrAccessorMethod)setter;
+ }
+ }
+ return null;
+ }
+
+ public static GrAccessorMethod[] findGetters(GrField field) {
+ return CachedValuesManager.getCachedValue(field, () -> CachedValueProvider.Result.create(
+ doGetGetters(field), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
+ ));
+ }
+
+ @NotNull
+ private static GrAccessorMethod[] doGetGetters(GrField field) {
+ PsiClass containingClass = field.getContainingClass();
+ if (containingClass == null) return GrAccessorMethod.EMPTY_ARRAY;
+
+ GrAccessorMethod getter = null;
+ GrAccessorMethod booleanGetter = null;
+
+ PsiMethod[] getters = containingClass.findMethodsByName(GroovyPropertyUtils.getGetterNameNonBoolean(field.getName()), false);
+ for (PsiMethod method : getters) {
+ if (method instanceof GrAccessorMethod) {
+ getter = (GrAccessorMethod)method;
+ break;
+ }
+ }
+
+ PsiMethod[] booleanGetters = containingClass.findMethodsByName(GroovyPropertyUtils.getGetterNameBoolean(field.getName()), false);
+ for (PsiMethod method : booleanGetters) {
+ if (method instanceof GrAccessorMethod) {
+ booleanGetter = (GrAccessorMethod)method;
+ break;
+ }
+ }
+
+ if (getter != null && booleanGetter != null) {
+ return new GrAccessorMethod[]{getter, booleanGetter};
+ }
+ else if (getter != null) {
+ return new GrAccessorMethod[]{getter};
+ }
+ else {
+ return GrAccessorMethod.EMPTY_ARRAY;
+ }
+ }
}