/* * Copyright 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.common.css.compiler.ast; import com.google.common.css.SourceCodeLocation; /** * A node representing a combinator of selectors in the AST. * * @author oana@google.com (Oana Florescu) */ public class CssCombinatorNode extends CssNode { /** * Contains the list of all possible CSS combinators. */ public enum Combinator { DESCENDANT(" "), DEEP("/deep/"), CHILD(">"), ADJACENT_SIBLING("+"), GENERAL_SIBLING("~"); private final String symbol; private Combinator(String symbol) { this.symbol = symbol; } public String getCanonicalName() { return symbol; } } /** Reference to a child selector. */ private CssSelectorNode selector; /** Type of combinator. */ private Combinator type; /** * Constructor of a combinator node. * * @param selector * @param type * @param sourceCodeLocation */ public CssCombinatorNode(CssSelectorNode selector, Combinator type, SourceCodeLocation sourceCodeLocation) { super(sourceCodeLocation); this.selector = selector; becomeParentForNode(this.selector); this.type = type; } /** * Constructor of a combinator node. * * @param type * @param sourceCodeLocation */ public CssCombinatorNode(Combinator type, SourceCodeLocation sourceCodeLocation) { this(null, type, sourceCodeLocation); } /** * Copy constructor. * * @param node */ public CssCombinatorNode(CssCombinatorNode node) { this( node.getSelector().deepCopy(), node.getCombinatorType(), node.getSourceCodeLocation()); } @Override public CssCombinatorNode deepCopy() { return new CssCombinatorNode(this); } public CssSelectorNode getSelector() { return selector; } public void setSelector(CssSelectorNode selector) { if (this.selector != null) { removeAsParentOfNode(this.selector); } this.selector = selector; becomeParentForNode(this.selector); } public Combinator getCombinatorType() { return type; } @Override public String toString() { return type.getCanonicalName() + selector; } }