package com.siberika.idea.pascal.editor.completion;
import com.intellij.codeInsight.completion.CompletionConfidence;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.ThreeState;
import com.siberika.idea.pascal.lang.lexer.PascalLexer;
import com.siberika.idea.pascal.lang.psi.PasTypes;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Pattern;
/**
* Author: George Bakhtadze
* Date: 01/10/2013
*/
public class PascalCompletionConfidence extends CompletionConfidence {
@NotNull
@Override
public ThreeState shouldSkipAutopopup(@NotNull PsiElement contextElement, @NotNull PsiFile psiFile, int offset) {
if ((contextElement.getPrevSibling() != null) && (contextElement.getPrevSibling().getNode() != null)) {
/*System.out.println("===*** shouldSkipAutopopup: " + contextElement + ", sib: " + contextElement.getPrevSibling()
+ ", par: " + contextElement.getParent());*/
IElementType type = contextElement.getPrevSibling().getNode().getElementType();
if (!isName(type)) {
type = contextElement.getNode().getElementType();
}
if (!isName(type) && !PascalLexer.COMPILER_DIRECTIVES.contains(type) && shouldSkipInComment(contextElement, offset)) {
return ThreeState.YES;
}
}
return super.shouldSkipAutopopup(contextElement, psiFile, offset);
}
private static final Pattern COMMENT_BEGIN = Pattern.compile("\\{\\$?\\w+");
private boolean shouldSkipInComment(PsiElement contextElement, int offset) {
int len = offset - contextElement.getTextRange().getStartOffset();
String text = contextElement.getText().substring(0, len);
return !COMMENT_BEGIN.matcher(text).matches();
}
private boolean isName(IElementType type) {
return (type == PasTypes.SUB_IDENT) || (type == PasTypes.NAME) || (type != PasTypes.CALL_EXPR);
}
}