blob: a2faabdb66cc5c8f784c6e92438eb1e04469c57c [file] [log] [blame]
/*******************************************************************************
* 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$
String sname = scope.getName();
if (sname.length() == 0) {
for (IScope parent = scope.getParent()
; parent != null
; parent = parent.getParent())
if ((sname = parent.getName()).length() != 0)
break;
if (sname.length() != 0) {
sname += "()"; //$NON-NLS-1$
if (scope instanceof LexicalBlockScope)
sname += "{.lexBlk.}"; //$NON-NLS-1$
} else
sname = "{." + scope.getClass().getSimpleName() + ".}";
}
builder.append(sname);
}
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;
}
}