/*
* 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.template.soy.exprtree;
import com.google.template.soy.base.SourceLocation;
import com.google.template.soy.basetree.CopyState;
/**
* Container of nodes representing operators.
*
* <p>Important: Do not use outside of Soy code (treat as superpackage-private).
*
*/
public class OperatorNodes {
private OperatorNodes() {}
/** Node representing the unary '-' (negative) operator. */
public static final class NegativeOpNode extends AbstractOperatorNode {
public NegativeOpNode(SourceLocation sourceLocation) {
super(Operator.NEGATIVE, sourceLocation);
}
private NegativeOpNode(NegativeOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.NEGATIVE_OP_NODE;
}
@Override
public NegativeOpNode copy(CopyState copyState) {
return new NegativeOpNode(this, copyState);
}
}
/** Node representing the 'not' operator. */
public static final class NotOpNode extends AbstractOperatorNode {
public NotOpNode(SourceLocation sourceLocation) {
super(Operator.NOT, sourceLocation);
}
private NotOpNode(NotOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.NOT_OP_NODE;
}
@Override
public NotOpNode copy(CopyState copyState) {
return new NotOpNode(this, copyState);
}
}
/** Node representing the '*' (times) operator. */
public static final class TimesOpNode extends AbstractOperatorNode {
public TimesOpNode(SourceLocation sourceLocation) {
super(Operator.TIMES, sourceLocation);
}
private TimesOpNode(TimesOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.TIMES_OP_NODE;
}
@Override
public TimesOpNode copy(CopyState copyState) {
return new TimesOpNode(this, copyState);
}
}
/** Node representing the '/' (divde by) operator. */
public static final class DivideByOpNode extends AbstractOperatorNode {
public DivideByOpNode(SourceLocation sourceLocation) {
super(Operator.DIVIDE_BY, sourceLocation);
}
private DivideByOpNode(DivideByOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.DIVIDE_BY_OP_NODE;
}
@Override
public DivideByOpNode copy(CopyState copyState) {
return new DivideByOpNode(this, copyState);
}
}
/** Node representing the '%' (mod) operator. */
public static final class ModOpNode extends AbstractOperatorNode {
public ModOpNode(SourceLocation sourceLocation) {
super(Operator.MOD, sourceLocation);
}
private ModOpNode(ModOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.MOD_OP_NODE;
}
@Override
public ModOpNode copy(CopyState copyState) {
return new ModOpNode(this, copyState);
}
}
/** Node representing the '+' (plus) operator. */
public static final class PlusOpNode extends AbstractOperatorNode {
public PlusOpNode(SourceLocation sourceLocation) {
super(Operator.PLUS, sourceLocation);
}
private PlusOpNode(PlusOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.PLUS_OP_NODE;
}
@Override
public PlusOpNode copy(CopyState copyState) {
return new PlusOpNode(this, copyState);
}
}
/** Node representing the binary '-' (minus) operator. */
public static final class MinusOpNode extends AbstractOperatorNode {
public MinusOpNode(SourceLocation sourceLocation) {
super(Operator.MINUS, sourceLocation);
}
private MinusOpNode(MinusOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.MINUS_OP_NODE;
}
@Override
public MinusOpNode copy(CopyState copyState) {
return new MinusOpNode(this, copyState);
}
}
/** Node representing the '<' (less than) operator. */
public static final class LessThanOpNode extends AbstractOperatorNode {
public LessThanOpNode(SourceLocation sourceLocation) {
super(Operator.LESS_THAN, sourceLocation);
}
private LessThanOpNode(LessThanOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.LESS_THAN_OP_NODE;
}
@Override
public LessThanOpNode copy(CopyState copyState) {
return new LessThanOpNode(this, copyState);
}
}
/** Node representing the '>' (greater than) operator. */
public static final class GreaterThanOpNode extends AbstractOperatorNode {
public GreaterThanOpNode(SourceLocation sourceLocation) {
super(Operator.GREATER_THAN, sourceLocation);
}
private GreaterThanOpNode(GreaterThanOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.GREATER_THAN_OP_NODE;
}
@Override
public GreaterThanOpNode copy(CopyState copyState) {
return new GreaterThanOpNode(this, copyState);
}
}
/** Node representing the '<=' (less than or equal) operator. */
public static final class LessThanOrEqualOpNode extends AbstractOperatorNode {
public LessThanOrEqualOpNode(SourceLocation sourceLocation) {
super(Operator.LESS_THAN_OR_EQUAL, sourceLocation);
}
private LessThanOrEqualOpNode(LessThanOrEqualOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.LESS_THAN_OR_EQUAL_OP_NODE;
}
@Override
public LessThanOrEqualOpNode copy(CopyState copyState) {
return new LessThanOrEqualOpNode(this, copyState);
}
}
/** Node representing the '>=' (greater than or equal) operator. */
public static final class GreaterThanOrEqualOpNode extends AbstractOperatorNode {
public GreaterThanOrEqualOpNode(SourceLocation sourceLocation) {
super(Operator.GREATER_THAN_OR_EQUAL, sourceLocation);
}
private GreaterThanOrEqualOpNode(GreaterThanOrEqualOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.GREATER_THAN_OR_EQUAL_OP_NODE;
}
@Override
public GreaterThanOrEqualOpNode copy(CopyState copyState) {
return new GreaterThanOrEqualOpNode(this, copyState);
}
}
/** Node representing the '==' (equal) operator. */
public static final class EqualOpNode extends AbstractOperatorNode {
public EqualOpNode(SourceLocation sourceLocation) {
super(Operator.EQUAL, sourceLocation);
}
private EqualOpNode(EqualOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.EQUAL_OP_NODE;
}
@Override
public EqualOpNode copy(CopyState copyState) {
return new EqualOpNode(this, copyState);
}
}
/** Node representing the '!=' (not equal) operator. */
public static final class NotEqualOpNode extends AbstractOperatorNode {
public NotEqualOpNode(SourceLocation sourceLocation) {
super(Operator.NOT_EQUAL, sourceLocation);
}
private NotEqualOpNode(NotEqualOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.NOT_EQUAL_OP_NODE;
}
@Override
public NotEqualOpNode copy(CopyState copyState) {
return new NotEqualOpNode(this, copyState);
}
}
/** Node representing the 'and' operator. */
public static final class AndOpNode extends AbstractOperatorNode {
public AndOpNode(SourceLocation sourceLocation) {
super(Operator.AND, sourceLocation);
}
private AndOpNode(AndOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.AND_OP_NODE;
}
@Override
public AndOpNode copy(CopyState copyState) {
return new AndOpNode(this, copyState);
}
}
/** Node representing the 'or' operator. */
public static final class OrOpNode extends AbstractOperatorNode {
public OrOpNode(SourceLocation sourceLocation) {
super(Operator.OR, sourceLocation);
}
private OrOpNode(OrOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.OR_OP_NODE;
}
@Override
public OrOpNode copy(CopyState copyState) {
return new OrOpNode(this, copyState);
}
}
/** Node representing the '?:' (null-coalescing) operator. */
public static final class NullCoalescingOpNode extends AbstractOperatorNode {
public NullCoalescingOpNode(SourceLocation sourceLocation) {
super(Operator.NULL_COALESCING, sourceLocation);
}
private NullCoalescingOpNode(NullCoalescingOpNode orig, CopyState copyState) {
super(orig, copyState);
}
public ExprNode getLeftChild() {
return getChild(0);
}
public ExprNode getRightChild() {
return getChild(1);
}
@Override
public Kind getKind() {
return Kind.NULL_COALESCING_OP_NODE;
}
@Override
public NullCoalescingOpNode copy(CopyState copyState) {
return new NullCoalescingOpNode(this, copyState);
}
}
/** Node representing the ternary '? :' (conditional) operator. */
public static final class ConditionalOpNode extends AbstractOperatorNode {
public ConditionalOpNode(SourceLocation sourceLocation) {
super(Operator.CONDITIONAL, sourceLocation);
}
private ConditionalOpNode(ConditionalOpNode orig, CopyState copyState) {
super(orig, copyState);
}
@Override
public Kind getKind() {
return Kind.CONDITIONAL_OP_NODE;
}
@Override
public ConditionalOpNode copy(CopyState copyState) {
return new ConditionalOpNode(this, copyState);
}
}
}