package org.fandev.lang.fan.parsing.statements.typeDefinitions.typeDefs;
import com.intellij.lang.PsiBuilder;
import com.intellij.psi.tree.TokenSet;
import org.fandev.lang.fan.FanBundle;
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.MixinBlock;
import org.fandev.lang.fan.parsing.util.ParserUtils;
/**
* <ul>
* <li> Mixins are scoped within a pod and globally identified with the qualified name podName::MixinName</li>
* <li> Mixins contain zero or more uniquely named slots</li>
* <li> Mixins are implicitly abstract</li>
* <li> Mixins may inherit zero or more other mixins</li>
* </ul>
*
* @author Dror Bereznitsky
* @date Jan 15, 2009 12:04:44 AM
*/
public class MixinDefinition {
public static boolean parse(final PsiBuilder builder) {
final TokenSet modifers = Modifiers.parse(builder, DeclarationType.MIXIN);
ParserUtils.removeNls(builder);
if (!ParserUtils.getToken(builder, MIXIN_KEYWORD)) {
builder.error(FanBundle.message("keywords.expected", MIXIN_KEYWORD.toString()));
return false;
}
final boolean isBuiltInType = FAN_SYS_TYPE == builder.getTokenType();
if (!ParserUtils.parseName(builder)) {
return false;
}
ParserUtils.removeNls(builder);
// Only builtin mixin can be const
if (modifers.contains(CONST_KEYWORD) && !isBuiltInType) {
// illegal access modifier
final String tokenText = builder.getTokenText();
builder.error(FanBundle.message("illegal.modifier", tokenText, DeclarationType.MIXIN));
}
if (COLON.equals(builder.getTokenType())) {
InheritanceClause.parse(builder);
ParserUtils.removeNls(builder);
}
return MixinBlock.parse(builder, isBuiltInType);
}
}