package com.nvlad.yii2support.database; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.CompletionProvider; import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.openapi.editor.Document; import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; import com.jetbrains.php.lang.psi.elements.*; import com.nvlad.yii2support.common.ClassUtils; import com.nvlad.yii2support.common.DatabaseUtils; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; /** * Created by oleg on 28.03.2017. */ public class ParamsCompletionProvider extends CompletionProvider<CompletionParameters> { @Override protected void addCompletions(@NotNull CompletionParameters completionParameters, ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) { MethodReference methodRef = ClassUtils.getMethodRef(completionParameters.getPosition(), 10); PsiElement position = completionParameters.getPosition(); if (methodRef != null) { Method method = (Method) methodRef.resolve(); int paramPosition = ClassUtils.indexForElementInParameterList(completionParameters.getPosition()); if (method != null && paramPosition > 0 && method.getParameters().length > paramPosition) { if (method.getParameters()[paramPosition].getName().equals("params") && ( method.getParameters()[paramPosition - 1].getName().equals("condition") || method.getParameters()[paramPosition - 1].getName().equals("sql") || method.getParameters()[paramPosition - 1].getName().equals("expression") )) { PsiElement element = methodRef.getParameters()[paramPosition - 1]; String condition = ClassUtils.getStringByElement(element); String[] result = DatabaseUtils.extractParamsFromCondition(condition); ArrayList<String> usedItems = new ArrayList<>(); if (position.getParent().getParent().getParent() instanceof ArrayCreationExpression) { ArrayCreationExpression array = (ArrayCreationExpression) position.getParent().getParent().getParent(); for (ArrayHashElement elem : array.getHashElements()) { usedItems.add(ClassUtils.removeQuotes(elem.getKey().getText())); } } for (String resultItem : result) { if (!usedItems.contains(resultItem)) { LookupElementBuilder builder = LookupElementBuilder.create(resultItem).withInsertHandler((insertionContext, lookupElement) -> { Document document = insertionContext.getDocument(); int insertPosition = insertionContext.getSelectionEndOffset(); if (position.getParent().getParent().getParent() instanceof ArrayCreationExpression) { document.insertString(insertPosition + 1, " => "); insertPosition += 5; insertionContext.getEditor().getCaretModel().getCurrentCaret().moveToOffset(insertPosition); } }); completionResultSet.addElement(builder); } } } } } } }