/*=============================================================================#
 # Copyright (c) 2007, 2017 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.r.core.rsource.ast;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.statet.r.core.rlang.RTerminal;


public final class Special extends StdBinary {
	
	
	String qualifier;
	
	
	Special() {
	}
	
	
	@Override
	public final NodeType getNodeType() {
		return NodeType.SPECIAL;
	}
	
	@Override
	public final RTerminal getOperator(final int index) {
		return RTerminal.SPECIAL;
	}
	
	
	@Override
	public final void acceptInR(final RAstVisitor visitor) throws InvocationTargetException {
		visitor.visit(this);
	}
	
	
	@Override
	public final boolean equalsSingle(final RAstNode element) {
		return (element.getNodeType() == NodeType.SPECIAL);
	}
	
	@Override
	public boolean equalsValue(final RAstNode element) {
		return ((NodeType.SPECIAL == element.getNodeType())
				&& ((this.qualifier != null) ? this.qualifier.equals(((Special) element).qualifier) : (((Special) element).qualifier == null))
				&& this.leftExpr.node.equalsValue(element.getLeftExpr().node)
				&& this.rightExpr.node.equalsValue(element.getRightExpr().node) );
	}
	
}
