package com.seventh7.mybatis.contributor;
import com.google.common.base.Optional;
import com.intellij.codeInsight.completion.CompletionContributor;
import com.intellij.codeInsight.completion.CompletionParameters;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.completion.CompletionType;
import com.intellij.injected.editor.DocumentWindow;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.seventh7.mybatis.dom.model.IdDomElement;
import com.seventh7.mybatis.util.DomUtils;
import com.seventh7.mybatis.util.MapperUtils;
/**
* @author yanglin
*/
public class SqlParamCompletionContributor extends CompletionContributor {
@Override
public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet result) {
if (parameters.getCompletionType() != CompletionType.BASIC) {
return;
}
PsiElement position = parameters.getPosition();
PsiFile topLevelFile = InjectedLanguageUtil.getTopLevelFile(position);
if (DomUtils.isMybatisFile(topLevelFile)) {
if (shouldAddElement(position.getContainingFile(), parameters.getOffset())) {
process(topLevelFile, result, position);
}
}
}
private void process(PsiFile xmlFile, CompletionResultSet result, PsiElement position) {
DocumentWindow documentWindow = InjectedLanguageUtil.getDocumentWindow(position);
if (null != documentWindow) {
int offset = documentWindow.injectedToHost(position.getTextOffset());
Optional<IdDomElement> idDomElement = MapperUtils.findParentIdDomElement(xmlFile.findElementAt(offset));
if (idDomElement.isPresent()) {
TestParamContributor.addElementForPsiParameter(position.getProject(), result, idDomElement.get());
result.stopHere();
}
}
}
private boolean shouldAddElement(PsiFile file, int offset) {
String text = file.getText();
for (int i = offset - 1; i > 0; i--) {
char c = text.charAt(i);
if (c == '{' && text.charAt(i - 1) == '#') return true;
}
return false;
}
}