[groovy] extract multi-processor logic into separate class

This commit is contained in:
Daniil Ovchinnikov
2018-10-01 12:11:17 +03:00
parent bbcc8ca24d
commit 024eba915b
2 changed files with 37 additions and 10 deletions
@@ -29,17 +29,20 @@ import org.jetbrains.plugins.groovy.lang.resolve.GrResolverProcessor;
import org.jetbrains.plugins.groovy.lang.resolve.MethodResolveResult;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtilKt;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import static com.intellij.util.containers.ContainerUtil.concat;
import static java.util.Collections.singletonList;
import static org.jetbrains.plugins.groovy.lang.psi.util.PropertyUtilKt.isPropertyName;
import static org.jetbrains.plugins.groovy.lang.resolve.ResolveUtilKt.singleOrValid;
import static org.jetbrains.plugins.groovy.lang.resolve.ResolveUtilKt.valid;
import static org.jetbrains.plugins.groovy.lang.resolve.processors.inference.InferenceKt.buildTopLevelArgumentTypes;
import static org.jetbrains.plugins.groovy.lang.resolve.processors.inference.InferenceKt.getTopLevelTypeCached;
public abstract class GroovyResolverProcessor implements PsiScopeProcessor, ElementClassHint, NameHint, DynamicMembersHint {
public abstract class GroovyResolverProcessor implements PsiScopeProcessor, ElementClassHint, NameHint, DynamicMembersHint, MultiProcessor {
protected final @NotNull GrReferenceExpression myRef;
private final @NotNull String myName;
@@ -82,7 +85,7 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem
}
final Lazy<PsiType> receiverType = LazyKt.lazy(() -> getTopLevelQualifierType());
if (myIsLValue) {
return Collections.singletonList(
return singletonList(
new PropertyProcessor(receiverType, myName, PropertyKind.SETTER, () -> myArgumentTypes.getValue(), myRef)
);
}
@@ -106,14 +109,8 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem
return myAcceptableKinds.contains(GroovyResolveKind.PROPERTY);
}
public static List<PsiScopeProcessor> allProcessors(PsiScopeProcessor processor) {
if (processor instanceof GroovyResolverProcessor && !((GroovyResolverProcessor)processor).myStopExecutingMethods) {
List<GrResolverProcessor<? extends GroovyResolveResult>> accessors = ((GroovyResolverProcessor)processor).myAccessorProcessors;
if (!accessors.isEmpty()) {
return ContainerUtil.concat(Collections.singletonList(processor), accessors);
}
}
return Collections.singletonList(processor);
public static Iterable<? extends PsiScopeProcessor> allProcessors(PsiScopeProcessor processor) {
return MultiProcessor.allProcessors(processor);
}
@Override
@@ -207,6 +204,13 @@ public abstract class GroovyResolverProcessor implements PsiScopeProcessor, Elem
return true;
}
@NotNull
@Override
public Collection<? extends PsiScopeProcessor> getProcessors() {
return myStopExecutingMethods ? singletonList(this)
: concat(singletonList(this), myAccessorProcessors);
}
@NotNull
public abstract List<GroovyResolveResult> getCandidates();
@@ -0,0 +1,23 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.groovy.lang.resolve.processors;
import com.intellij.psi.scope.PsiScopeProcessor;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import static java.util.Collections.singletonList;
import static org.jetbrains.annotations.ApiStatus.Experimental;
@Experimental
public interface MultiProcessor extends PsiScopeProcessor {
@NotNull
Collection<? extends PsiScopeProcessor> getProcessors();
@NotNull
static Iterable<? extends PsiScopeProcessor> allProcessors(@NotNull PsiScopeProcessor processor) {
return processor instanceof MultiProcessor ? ((MultiProcessor)processor).getProcessors()
: singletonList(processor);
}
}