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.EnumBlock;
import org.fandev.lang.fan.parsing.util.ParserUtils;
/**
* <ul>
* <li> Enums are normal classes with all associated characteristics</li>
* <li> Enums are implied const</li>
* <li> Enums are implied final</li>
* <li> Enums have a fixed range of instances</li>
* <li> Enums always always inherit from sys::Enum</li>
* <li> Enums may inherit zero or more mixins</li>
* </ul>
*
* @author Dror Bereznitsky
* @date Jan 15, 2009 12:03:28 AM
*/
public class EnumDefinition {
public static boolean parse(final PsiBuilder builder) {
Modifiers.parse(builder, DeclarationType.ENUM);
ParserUtils.removeNls(builder);
if (!ParserUtils.getToken(builder, ENUM_KEYWORD)) {
builder.error(FanBundle.message("keywords.expected", ENUM_KEYWORD.toString()));
return false;
}
ParserUtils.removeNls(builder);
// Enum 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);
// Enums may inherit zero or more mixins
if (COLON.equals(builder.getTokenType())) {
InheritanceClause.parse(builder);
ParserUtils.removeNls(builder);
}
return EnumBlock.parse(builder, isBuiltInType);
}
}