package com.nvlad.yii2support.database;
import com.intellij.codeInsight.completion.*;
import com.intellij.openapi.util.Pair;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.MultiMap;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.psi.elements.*;
import com.nvlad.yii2support.common.ClassUtils;
import org.jetbrains.annotations.NotNull;
public class QueryCompletionContributor extends com.intellij.codeInsight.completion.CompletionContributor {
private final MultiMap<CompletionType, Pair<ElementPattern<? extends PsiElement>, CompletionProvider<CompletionParameters>>> myMap = new MultiMap();
public QueryCompletionContributor() {
extend(CompletionType.BASIC, ElementPattern(), new QueryCompletionProvider());
}
@Override
public boolean invokeAutoPopup(@NotNull PsiElement position, char typeChar) {
if ((typeChar == '\'' || typeChar == '"' || typeChar == '.') ) {
MethodReference methodRef = ClassUtils.getMethodRef(position, 10);
if (methodRef != null) {
Method method = (Method)methodRef.resolve();
if (method != null) {
Object possibleClass = method.getParent();
if (possibleClass instanceof PhpClass) {
PhpIndex index = PhpIndex.getInstance(method.getProject());
if (ClassUtils.isClassInheritsOrEqual((PhpClass)possibleClass, ClassUtils.getClass(index, "\\yii\\db\\Query")) ||
ClassUtils.isClassInheritsOrEqual((PhpClass)possibleClass, ClassUtils.getClass(index, "\\yii\\db\\Command")) ||
ClassUtils.isClassInherit((PhpClass)possibleClass, ClassUtils.getClass(index, "\\yii\\db\\BaseActiveRecord")) ||
ClassUtils.isClassInheritsOrEqual((PhpClass)possibleClass, ClassUtils.getClass(index, "\\yii\\db\\Migration"))
) {
return true;
}
}
}
}
}
return false;
}
private static ElementPattern<PsiElement> ElementPattern() {
return
PlatformPatterns.or(
// ["<caret>
PlatformPatterns.psiElement().withSuperParent(3, ArrayCreationExpression.class),
// string
PlatformPatterns.psiElement().withSuperParent(3, MethodReference.class).withParent(StringLiteralExpression.class),
// ["<caret>" => ""]
PlatformPatterns.psiElement().withSuperParent(4, ArrayCreationExpression.class)
);
}
}