package org.elixir_lang.psi.scope; import com.intellij.openapi.util.Condition; import com.intellij.psi.ResolveResult; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; public class MultiResolve { /* * Constants */ public static final Condition<ResolveResult> HAS_VALID_RESULT_CONDITION = new Condition<ResolveResult>() { @Override public boolean value(ResolveResult resolveResult) { return resolveResult.isValidResult(); } }; /* * Public Static Methods */ public static List<ResolveResult> addToResolveResultList(@Nullable List<ResolveResult> resolveResultList, @NotNull ResolveResult resolveResult) { if (resolveResultList == null) { resolveResultList = new ArrayList<ResolveResult>(); } resolveResultList.add(resolveResult); return resolveResultList; } /** * Whether the {@code resolveResultList} has any {@link ResolveResult} where {@link ResolveResult#isValidResult()} * is {@code true}. * * @return {@code false} if {@code resolveResultList} is {@code null}; otherwise, {@code true} if the * {@code resolveResultList} has any {@link ResolveResult} where {@link ResolveResult#isValidResult()} is * {@code true}. */ public static boolean hasValidResult(@Nullable List<ResolveResult> resolveResultList) { boolean hasValidResult = false; if (resolveResultList != null) { hasValidResult = ContainerUtil.exists(resolveResultList, HAS_VALID_RESULT_CONDITION); } return hasValidResult; } /** * Keep trying to resolve the reference if {@code resolveResultList} does not have a valid result or the code is * incomplete. * * @return {@code false} if {@link #hasValidResult(List)} or {@code incompleteCode} is {@code false}, so only one * valid result is allowed. */ public static boolean keepProcessing(boolean incompleteCode, @Nullable List<ResolveResult> resolveResultList) { return incompleteCode || !hasValidResult(resolveResultList); } }