package com.github.sommeri.less4j.core.validators; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import com.github.sommeri.less4j.core.ast.ASTCssNodeType; import com.github.sommeri.less4j.core.ast.Body; //this check is that important, the allowed css types check can be public class SupportedCSSBodyMembers { public Set<ASTCssNodeType> getSupportedMembers(Body node) { if (node.getParent() != null) return getSupportedMembers(node.getType(), node.getParent().getType()); return getSupportedMembers(node.getType(), null); } public Set<ASTCssNodeType> getSupportedMembers(ASTCssNodeType bodyType, ASTCssNodeType ownerType) { //special case - style sheet does not have owner switch (bodyType) { case STYLE_SHEET: return topLevelElements(); default: //nothing is needed } if (ownerType == null) return allNodeTypes(); switch (ownerType) { case VIEWPORT: return createSet(ASTCssNodeType.DECLARATION, ASTCssNodeType.UNKNOWN_AT_RULE, ASTCssNodeType.FAULTY_NODE); case RULE_SET: return createSet(ASTCssNodeType.DECLARATION, ASTCssNodeType.UNKNOWN_AT_RULE, ASTCssNodeType.FAULTY_NODE); case PAGE: return createSet(ASTCssNodeType.DECLARATION, ASTCssNodeType.UNKNOWN_AT_RULE, ASTCssNodeType.PAGE_MARGIN_BOX, ASTCssNodeType.FAULTY_NODE); case PAGE_MARGIN_BOX: return createSet(ASTCssNodeType.DECLARATION, ASTCssNodeType.UNKNOWN_AT_RULE, ASTCssNodeType.FAULTY_NODE); case MEDIA: case DOCUMENT: return topLevelElements(); case KEYFRAMES: return createSet(ASTCssNodeType.RULE_SET, ASTCssNodeType.UNKNOWN_AT_RULE, ASTCssNodeType.FAULTY_NODE); default: return allNodeTypes(); } } private Set<ASTCssNodeType> topLevelElements() { Set<ASTCssNodeType> result = allNodeTypes(); // removed only the elements that are likely to end there, this method could be done in more precise way result.remove(ASTCssNodeType.DECLARATION); result.remove(ASTCssNodeType.PAGE_MARGIN_BOX); return result; } private Set<ASTCssNodeType> createSet(ASTCssNodeType... types) { return new HashSet<ASTCssNodeType>(Arrays.asList(types)); } private Set<ASTCssNodeType> allNodeTypes() { return new HashSet<ASTCssNodeType>(Arrays.asList(ASTCssNodeType.values())); } }