package org.fandev.lang.fan.parsing.statements.typeDefinitions.typeDefs; import com.intellij.lang.PsiBuilder; import org.fandev.lang.fan.FanBundle; import org.fandev.lang.fan.FanElementTypes; import static org.fandev.lang.fan.FanTokenTypes.*; import org.fandev.lang.fan.parsing.auxiliary.modifiers.Modifiers; import org.fandev.lang.fan.parsing.statements.declaration.DeclarationType; import org.fandev.lang.fan.parsing.statements.typeDefinitions.InheritanceClause; import org.fandev.lang.fan.parsing.statements.typeDefinitions.blocks.ClassBlock; import org.fandev.lang.fan.parsing.util.ParserUtils; /** * @author Dror Bereznitsky * @date Jan 6, 2009 4:43:55 PM */ public class ClassDefinition { public static boolean parse(final PsiBuilder builder) { Modifiers.parse(builder, DeclarationType.CLASS); if (!ParserUtils.getToken(builder, CLASS_KEYWORD)) { builder.error(FanBundle.message("keywords.expected", CLASS_KEYWORD.toString())); return false; } ParserUtils.removeNls(builder); // Class name can be one of the built in types in case of the Fan language sources if (!IDENTIFIER_TOKENS_SET.contains(builder.getTokenType())) { builder.error(FanBundle.message("identifier.expected")); return false; } final boolean isBuiltInType = FAN_SYS_TYPE == builder.getTokenType(); final PsiBuilder.Marker idMark = builder.mark(); builder.advanceLexer(); idMark.done(FanElementTypes.NAME_ELEMENT); ParserUtils.removeNls(builder); if (COLON.equals(builder.getTokenType())) { InheritanceClause.parse(builder); ParserUtils.removeNls(builder); } return ClassBlock.parse(builder, isBuiltInType); } }