/*=============================================================================#
 # Copyright (c) 2007, 2020 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 java.util.Objects;

import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;

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


/**
 * 
 */
@NonNullByDefault
public abstract class Symbol extends SingleValue {
	
	
	static final class Std extends Symbol {
		
		
		Std() {
		}
		
		
		@Override
		public final @Nullable RTerminal getOperator(final int index) {
			return null;
		}
		
	}
	
	
	static final class G extends Symbol {
		
		
		G() {
		}
		
		
		@Override
		public final RTerminal getOperator(final int index) {
			return RTerminal.SYMBOL_G;
		}
		
	}
	
	
	protected Symbol() {
	}
	
	
	@Override
	public final NodeType getNodeType() {
		return NodeType.SYMBOL;
	}
	
	
	@Override
	public final void acceptInR(final RAstVisitor visitor) throws InvocationTargetException {
		visitor.visit(this);
	}
	
	
	@Override
	public final boolean equalsSingle(final RAstNode element) {
		if (NodeType.SYMBOL == element.getNodeType()) {
			final Symbol other= (Symbol)element;
			return (Objects.equals(this.text, other.text));
		}
		return false;
	}
	
	@Override
	void appendPathElement(final StringBuilder s) {
//		if (parent != null) {
//			s.append(parent.getEqualsIndex(this));
//		}
		s.append('$');
		s.append(this.text);
	}
	
}
