package com.innovatian.idea.powershell.lang.parser.parsing;
import com.intellij.lang.PsiBuilder;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
public abstract class ParserUtils {
public static boolean getToken(PsiBuilder builder, IElementType elem, String errorMsg) {
if (elem.equals(builder.getTokenType())) {
builder.advanceLexer();
return true;
} else {
if (errorMsg != null)
builder.error(errorMsg);
return false;
}
}
public static boolean getToken(PsiBuilder builder, IElementType elem) {
final IElementType tokenType = builder.getTokenType();
if (elem.equals(tokenType)) {
builder.advanceLexer();
return true;
}
return false;
}
public static boolean getToken(PsiBuilder builder, TokenSet tokenSet) {
if (tokenSet.contains(builder.getTokenType())) {
return getToken(builder, builder.getTokenType(), null);
}
return false;
}
public static boolean getToken(PsiBuilder builder, TokenSet tokenSet, String msg) {
if (tokenSet.contains(builder.getTokenType())) {
return getToken(builder, builder.getTokenType(), msg);
}
return false;
}
public static boolean lookAhead(PsiBuilder builder, IElementType... elems) {
if (!elems[0].equals(builder.getTokenType())) return false;
if (elems.length == 1) return true;
PsiBuilder.Marker rb = builder.mark();
builder.advanceLexer();
int i = 1;
while (!builder.eof() && i < elems.length && elems[i].equals(builder.getTokenType())) {
builder.advanceLexer();
i++;
}
rb.rollbackTo();
return i == elems.length;
}
public static boolean lookAhead(PsiBuilder builder, boolean dropMarker, IElementType... elems) {
if (elems.length == 0) {
return false;
}
if (elems.length == 1) {
return elems[0].equals(builder.getTokenType());
}
PsiBuilder.Marker rb = builder.mark();
int i = 0;
while (!builder.eof() && i < elems.length && elems[i].equals(builder.getTokenType())) {
builder.advanceLexer();
i++;
}
if (dropMarker && i == elems.length) {
rb.drop();
} else {
rb.rollbackTo();
}
return i == elems.length;
}
public static IElementType eatElement(PsiBuilder builder, IElementType elem) {
PsiBuilder.Marker marker = builder.mark();
builder.advanceLexer();
marker.done(elem);
return elem;
}
public static void wrapError(PsiBuilder builder, String msg) {
PsiBuilder.Marker marker = builder.mark();
builder.advanceLexer();
marker.error(msg);
}
public static void advance(PsiBuilder builder, int count) {
for (int i = 0; i < count; i++) {
builder.getTokenText();
builder.advanceLexer();
}
}
public static void advance(PsiBuilder builder) {
advance(builder, 1);
}
}