content: /*******************************************************************************
   * Copyright (c) 2000, 2008 IBM Corporation and others.
   * All rights reserved. This program and the accompanying materials
   * are made available under the terms of the Eclipse Public License v1.0
   * which accompanies this distribution, and is available at
   * http://www.eclipse.org/legal/epl-v10.html
   *
   * Contributors:
   *     IBM Corporation - initial API and implementation
   *******************************************************************************/
  
  package org.eclipse.wst.jsdt.internal.ui.javaeditor;
  
  import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;
  import org.eclipse.wst.jsdt.core.dom.Expression;
  import org.eclipse.wst.jsdt.core.dom.IBinding;
  import org.eclipse.wst.jsdt.core.dom.SimpleName;
  
  /**
   * Semantic token
   */
  public final class SemanticToken {
  
  	/** AST node */
  	private SimpleName fNode;
  	private Expression fLiteral;
  
  	/** Binding */
  	private IBinding fBinding;
  	/** Is the binding resolved? */
  	private boolean fIsBindingResolved= false;
  
  	/** AST root */
  	private JavaScriptUnit fRoot;
  	private boolean fIsRootResolved= false;
  
  	/**
  	 * @return Returns the binding, can be <code>null</code>.
  	 */
  	public IBinding getBinding() {
  		if (!fIsBindingResolved) {
  			fIsBindingResolved= true;
  			if (fNode != null)
  				fBinding= fNode.resolveBinding();
  		}
  		
  		return fBinding;
  	}
  
  	/**
  	 * @return the AST node (a {@link SimpleName})
  	 */
  	public SimpleName getNode() {
  		return fNode;
  	}
  	
  	/**
  	 * @return the AST node (a <code>Boolean-, Character- or NumberLiteral</code>)
  	 */
  	public Expression getLiteral() {
  		return fLiteral;
  	}
  
  	/**
  	 * @return the AST root
  	 */
  	public JavaScriptUnit getRoot() {
  		if (!fIsRootResolved) {
  			fIsRootResolved= true;
  			fRoot= (JavaScriptUnit) (fNode != null ? fNode : fLiteral).getRoot();
  		}
  
  		return fRoot;
  	}
  
  	/**
  	 * Update this token with the given AST node.
  	 * <p>
  	 * NOTE: Allowed to be used by {@link SemanticHighlightingReconciler} only.
  	 * </p>
  	 *
  	 * @param node the AST simple name
  	 */
  	void update(SimpleName node) {
  		clear();
  		fNode= node;
  	}
  
  	/**
  	 * Update this token with the given AST node.
  	 * <p>
  	 * NOTE: Allowed to be used by {@link SemanticHighlightingReconciler} only.
  	 * </p>
  	 *
  	 * @param literal the AST literal
  	 */
  	void update(Expression literal) {
  		clear();
  		fLiteral= literal;
  	}
  
  	/**
  	 * Clears this token.
  	 * <p>
  	 * NOTE: Allowed to be used by {@link SemanticHighlightingReconciler} only.
  	 * </p>
  	 */
  	void clear() {
  		fNode= null;
  		fLiteral= null;
  		fBinding= null;
  		fIsBindingResolved= false;
  		fRoot= null;
  		fIsRootResolved= false;
  	}
  }
  