package org.fandev.lang.fan.parsing.auxiliary.modifiers; import com.intellij.lang.PsiBuilder; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import org.fandev.lang.fan.FanBundle; import static org.fandev.lang.fan.FanElementTypes.MODIFIERS; import org.fandev.lang.fan.FanTokenTypes; import static org.fandev.lang.fan.FanTokenTypes.IDENTIFIER_TOKENS_SET; import org.fandev.lang.fan.parsing.statements.declaration.DeclarationType; import org.fandev.lang.fan.parsing.util.ParserUtils; /** * @author Dror Bereznitsky * @date Jan 6, 2009 2:24:23 PM */ public class Modifiers { public static TokenSet parse(final PsiBuilder builder, final DeclarationType stmtType) { TokenSet modifiers = TokenSet.create(); ParserUtils.removeNls(builder); PsiBuilder.Marker modifiersMarker = builder.mark(); while (!builder.eof()) { // Either a modifier or the keyword/identifier... if (stmtType.getKeyword() != null) { if (stmtType.getKeyword().equals(builder.getTokenType())) { modifiersMarker.done(MODIFIERS); return modifiers; } } else { if (IDENTIFIER_TOKENS_SET.contains(builder.getTokenType())) { modifiersMarker.done(MODIFIERS); return modifiers; } } final IElementType possibleModifier = builder.getTokenType(); if (!Modifier.parse(builder, stmtType)) { if (FanTokenTypes.ALL_MODIFIERS.contains(possibleModifier)) { // illegal access modifier final String tokenText = builder.getTokenText(); builder.error(FanBundle.message("illegal.modifier", tokenText, stmtType)); builder.advanceLexer(); } else { modifiersMarker.done(MODIFIERS); break; } } else { modifiers = TokenSet.orSet(modifiers, TokenSet.create(possibleModifier)); } } return modifiers; } }