package org.fandev.lang.fan.parsing.statements.typeDefinitions.typeDefs;
import com.intellij.lang.PsiBuilder;
import org.fandev.lang.fan.FanBundle;
import static org.fandev.lang.fan.FanElementTypes.*;
import static org.fandev.lang.fan.FanTokenTypes.*;
import org.fandev.lang.fan.parsing.auxiliary.facets.Facet;
import org.fandev.lang.fan.parsing.util.ParserUtils;
/**
* @author Dror Bereznitsky
* @date Jan 6, 2009 2:16:52 PM
*/
public class TypeDefinition {
public static boolean parse(final PsiBuilder builder) {
boolean res;
final PsiBuilder.Marker tdMarker = builder.mark();
Facet.parse(builder);
ParserUtils.removeNls(builder);
if (ParserUtils.lookAheadForElement(builder, CLASS_KEYWORD, LBRACE)) {
res = ClassDefinition.parse(builder);
tdMarker.done(CLASS_DEFINITION);
} else if (ParserUtils.lookAheadForElement(builder, POD_KEYWORD, LBRACE)) {
// Should be possible only in build.fan files
res = PodDefinition.parse(builder);
tdMarker.done(BUILDSCRIPT_DEFINITION);
} else if (ParserUtils.lookAheadForElement(builder, ENUM_KEYWORD, LBRACE)) {
res = EnumDefinition.parse(builder);
tdMarker.done(ENUM_DEFINITION);
} else if (ParserUtils.lookAheadForElement(builder, MIXIN_KEYWORD, LBRACE)) {
res = MixinDefinition.parse(builder);
tdMarker.done(MIXIN_DEFINITION);
} else {
res = false;
tdMarker.error(FanBundle.message("typedef.expected"));
}
ParserUtils.removeNls(builder);
return res;
}
}