package net.king2500.plugins.PhpAdvancedAutoComplete.reference; import com.intellij.codeInsight.highlighting.HighlightUsagesHandlerBase; import com.intellij.codeInsight.highlighting.HighlightUsagesHandlerFactoryBase; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.ObjectUtils; import com.jetbrains.php.codeInsight.PhpCodeInsightUtil; import com.jetbrains.php.lang.psi.PhpPsiUtil; import com.jetbrains.php.lang.psi.elements.Function; import com.jetbrains.php.lang.psi.elements.FunctionReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import com.jetbrains.php.lang.psi.elements.Statement; import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * @author Thomas Schulz <[email protected]> */ public class PhpHighlightPackParametersUsagesHandlerFactory extends HighlightUsagesHandlerFactoryBase { @Override public @Nullable HighlightUsagesHandlerBase createHighlightUsagesHandler(@NotNull Editor editor, @NotNull PsiFile file, @NotNull PsiElement target) { ParameterList parameterList = PhpPsiUtil.getParentByCondition(target, true, ParameterList.INSTANCEOF, Statement.INSTANCEOF); if (parameterList == null) { return null; } FunctionReference functionCall = ObjectUtils.tryCast(parameterList.getParent(), FunctionReference.class); String fqn = resolveFqn(functionCall); if (!"\\pack".equals(fqn)) { return null; } PsiElement[] parameters = parameterList.getParameters(); PsiElement selectedParameter = StreamEx.of(parameters).findFirst((p) -> p.getTextRange().containsOffset(editor.getCaretModel().getOffset())).orElse(null); if (selectedParameter == null) { return null; } int selectedIndex = PhpCodeInsightUtil.getParameterIndex(selectedParameter); if (selectedIndex < 0 || selectedIndex >= parameters.length) { return null; } return new PhpHighlightPackParametersUsagesHandler(editor, file, 0, selectedIndex, parameters); } @Nullable private static String resolveFqn(@Nullable FunctionReference reference) { Function function = reference != null ? ObjectUtils.tryCast(reference.resolve(), Function.class) : null; return function != null ? function.getFQN() : null; } }