package org.fandev.lang.fan.parsing.statements.typeDefinitions.blocks; import com.intellij.lang.PsiBuilder; import org.fandev.lang.fan.FanBundle; import org.fandev.lang.fan.FanElementTypes; import static org.fandev.lang.fan.FanTokenTypes.LBRACE; import static org.fandev.lang.fan.FanTokenTypes.RBRACE; import org.fandev.lang.fan.parsing.statements.typeDefinitions.members.SlotDefinition; import org.fandev.lang.fan.parsing.statements.declaration.DeclarationType; import org.fandev.lang.fan.parsing.util.ParserUtils; /** * @author Dror Bereznitsky * @date Jan 10, 2009 4:20:41 PM */ public class ClassBlock { /* <classBody> := "{" <slotDefs> "}" */ public static boolean parse(final PsiBuilder builder, final boolean isBuiltInType) { ParserUtils.removeNls(builder); final PsiBuilder.Marker blockMark = builder.mark(); if (!ParserUtils.getToken(builder, LBRACE)) { blockMark.error(FanBundle.message("lcurly.expected")); return false; } ParserUtils.removeNls(builder); while (!builder.eof() && builder.getTokenType() != RBRACE) { if (!SlotDefinition.parse(builder, DeclarationType.CLASS, isBuiltInType)) { break; } ParserUtils.removeNls(builder); } if (ParserUtils.getToken(builder, RBRACE, FanBundle.message("rcurly.expected"))) { blockMark.done(FanElementTypes.CLASS_BODY); return true; } else { ParserUtils.cleanAfterErrorInBlock(builder); blockMark.done(FanElementTypes.CLASS_BODY); return false; } } }