package com.siberika.idea.pascal.editor.completion;
import com.intellij.codeInsight.highlighting.BraceMatcher;
import com.intellij.openapi.editor.highlighter.HighlighterIterator;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.siberika.idea.pascal.lang.psi.PasTypes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Author: George Bakhtadze
* Date: 01/10/2013
*/
public class PascalBraceMatcher implements BraceMatcher {
@Override
public int getBraceTokenGroupId(IElementType tokenType) {
return 0; //To change body of implemented methods use File | Settings | File Templates.
}
private static final TokenSet END_PAIRS = TokenSet.create(PasTypes.BEGIN, PasTypes.TRY, PasTypes.CASE, PasTypes.ASM,
PasTypes.CLASS, PasTypes.INTERFACE, PasTypes.DISPINTERFACE, PasTypes.OBJECT, PasTypes.RECORD);
@Override
public boolean isLBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) {
return END_PAIRS.contains(iterator.getTokenType()) || (iterator.getTokenType() == PasTypes.REPEAT)
|| (iterator.getTokenType() == PasTypes.LBRACK) || (iterator.getTokenType() == PasTypes.LPAREN);
}
@Override
public boolean isRBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) {
return (iterator.getTokenType() == PasTypes.END) || (iterator.getTokenType() == PasTypes.UNTIL)
|| (iterator.getTokenType() == PasTypes.RBRACK) || (iterator.getTokenType() == PasTypes.RPAREN);
}
@Override
public boolean isPairBraces(IElementType tokenType, IElementType tokenType2) {
return isPairBracesInternal(tokenType, tokenType2) || isPairBracesInternal(tokenType2, tokenType);
}
private boolean isPairBracesInternal(IElementType tokenType, IElementType tokenType2) {
return (END_PAIRS.contains(tokenType) && (tokenType2 == PasTypes.END))
|| ((tokenType == PasTypes.REPEAT) && (tokenType2 == PasTypes.UNTIL))
|| ((tokenType == PasTypes.LBRACK) && (tokenType2 == PasTypes.RBRACK))
|| ((tokenType == PasTypes.LPAREN) && (tokenType2 == PasTypes.RPAREN));
}
@Override
public boolean isStructuralBrace(HighlighterIterator iterator, CharSequence text, FileType fileType) {
return END_PAIRS.contains(iterator.getTokenType()) || (iterator.getTokenType() == PasTypes.END)
|| (iterator.getTokenType() == PasTypes.REPEAT) || (iterator.getTokenType() == PasTypes.UNTIL);
}
@Nullable
@Override
public IElementType getOppositeBraceTokenType(@NotNull IElementType type) {
if (END_PAIRS.contains(type)) { return PasTypes.END; }
if (type == PasTypes.END) { return PasTypes.BEGIN; }
if (type == PasTypes.LBRACK) { return PasTypes.RBRACK; }
if (type == PasTypes.RBRACK) { return PasTypes.LBRACK; }
if (type == PasTypes.LPAREN) { return PasTypes.RPAREN; }
if (type == PasTypes.RPAREN) { return PasTypes.LPAREN; }
if (type == PasTypes.REPEAT) { return PasTypes.UNTIL; }
if (type == PasTypes.UNTIL) { return PasTypes.REPEAT; }
return null;
}
@Override
public boolean isPairedBracesAllowedBeforeType(@NotNull IElementType lbraceType, @Nullable IElementType contextType) {
return false;
}
@Override
public int getCodeConstructStart(PsiFile file, int openingBraceOffset) {
return openingBraceOffset;
}
}