/*******************************************************************************
 * Copyright (c) 2009, 2011 Nokia 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:
 * Nokia - Initial API and implementation
 * Broadcom - added hashCode() and equals() implementations
 *******************************************************************************/
package org.eclipse.cdt.debug.edc.internal.symbols;

import org.eclipse.cdt.debug.edc.symbols.ILocationProvider;
import org.eclipse.cdt.debug.edc.symbols.IScope;
import org.eclipse.cdt.debug.edc.symbols.IType;
import org.eclipse.cdt.debug.edc.symbols.IVariable;
import org.eclipse.core.runtime.IPath;


public class Variable implements IVariable {

	protected String name;
	protected IScope scope;
	protected IType type;
	protected ILocationProvider locationProvider;
	protected long startScope;
	protected boolean isDeclared;
	protected IPath definingFile;

	
	public Variable(String name, IScope scope, IType type, ILocationProvider locationProvider, boolean isDeclared, IPath definingFile) {
		this.name = name;
		this.scope = scope;
		this.type = type;
		this.locationProvider = locationProvider;
		this.isDeclared = isDeclared;
		this.definingFile = definingFile;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IVariable#dispose()
	 */
	public void dispose() {
		type = null;
		locationProvider = null;
		scope = null;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IVariable#getName()
	 */
	public String getName() {
		return name;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IVariable#getScope()
	 */
	public IScope getScope() {
		return scope;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IVariable#getType()
	 */
	public IType getType() {
		if (type instanceof IForwardTypeReference)
			type = ((IForwardTypeReference) type).getReferencedType();
		
		return type;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IVariable#getLocationProvider()
	 */
	public ILocationProvider getLocationProvider() {
		return locationProvider;
	}

	public void setStartScope(long start) {
		this.startScope = start;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IVariable#getStartScope()
	 */
	public long getStartScope() {
		return startScope;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.internal.symbols.IVariable#isDeclared()
	 */
	public boolean isDeclared() {
		return isDeclared;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.cdt.debug.edc.symbols.IVariable#getDefiningFile()
	 */
	public IPath getDefiningFile() {
		return definingFile;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Var ["); //$NON-NLS-1$
		if (name != null) {
			builder.append(name);
		}
		if (scope != null) {
			builder.append(", "); //$NON-NLS-1$
			builder.append("scope="); //$NON-NLS-1$
			builder.append(scope.getName());
		}
		builder.append("]"); //$NON-NLS-1$
		return builder.toString();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((definingFile == null) ? 0 : definingFile.hashCode());
		result = prime * result + (isDeclared ? 1231 : 1237);
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((scope == null) ? 0 : scope.hashCode());
		result = prime * result + (int) (startScope ^ (startScope >>> 32));
		result = prime * result + ((type == null) ? 0 : type.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Variable other = (Variable) obj;
		if (definingFile == null) {
			if (other.definingFile != null)
				return false;
		} else if (!definingFile.equals(other.definingFile))
			return false;
		if (isDeclared != other.isDeclared)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (scope == null) {
			if (other.scope != null)
				return false;
		} else if (!scope.equals(other.scope))
			return false;
		if (startScope != other.startScope)
			return false;
		if (type == null) {
			if (other.type != null)
				return false;
		} else if (!type.equals(other.type))
			return false;
		return true;
	}
}
