/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser.expressions;
import gw.internal.gosu.parser.Expression;
import gw.internal.gosu.parser.IGosuAnnotation;
import gw.internal.gosu.parser.statements.CatchClause;
import gw.internal.gosu.parser.statements.TryCatchFinallyStatement;
import gw.lang.parser.IDynamicFunctionSymbol;
import gw.lang.parser.IParseTree;
import gw.lang.parser.IParsedElement;
import gw.lang.parser.ISymbol;
import gw.lang.parser.expressions.IBlockExpression;
import gw.lang.parser.expressions.ILocalVarDeclaration;
import gw.lang.parser.statements.IForEachStatement;
import gw.lang.parser.statements.IFunctionStatement;
import java.util.Collections;
import java.util.List;
public class LocalVarDeclaration extends Expression implements ILocalVarDeclaration
{
private final String _strLocalVarName;
public LocalVarDeclaration( String strLocalVarName )
{
_strLocalVarName = strLocalVarName;
}
public CharSequence getLocalVarName()
{
return _strLocalVarName;
}
public Object evaluate()
{
return null; // Nothing to do
}
@Override
public String toString()
{
return getLocalVarName().toString();
}
public int getNameOffset( String identifierName )
{
return getLocation().getOffset();
}
public void setNameOffset( int iOffset, String identifierName )
{
// Can't set the name offset w/o also setting the location, so this is a no-op
}
public boolean declares( String identifierName )
{
return identifierName != null && identifierName.equals( _strLocalVarName );
}
public TypeLiteral getTypeLiteral()
{
for( IParseTree parseTree : getLocation().getChildren() )
{
if( parseTree.getParsedElement() instanceof TypeLiteral )
{
return (TypeLiteral)parseTree.getParsedElement();
}
}
return null;
}
public ISymbol getSymbol() {
return findSymbol( getParent() );
}
private ISymbol findSymbol( IParsedElement elem ) {
if( elem == null ) {
return null;
}
if( elem instanceof IFunctionStatement ) {
IDynamicFunctionSymbol dfs = ((IFunctionStatement)elem).getDynamicFunctionSymbol();
List<ISymbol> args = dfs.getArgs();
if( args != null ) {
for( ISymbol symbol: args ) {
if( _strLocalVarName.equals( symbol.getName() ) ) {
return symbol;
}
}
}
}
else if( elem instanceof IBlockExpression ) {
List<ISymbol> args = ((IBlockExpression)elem).getArgs();
if( args != null ) {
for(ISymbol symbol : args ) {
if( _strLocalVarName.equals(symbol.getName())) {
return symbol;
}
}
}
}
else if( elem instanceof IForEachStatement ) {
ISymbol symbol = ((IForEachStatement)elem).getIdentifier();
if( symbol != null && _strLocalVarName.equals(symbol.getName())) {
return symbol;
}
symbol = ((IForEachStatement)elem).getIndexIdentifier();
if( symbol != null && _strLocalVarName.equals(symbol.getName())) {
return symbol;
}
}
else if( elem instanceof TryCatchFinallyStatement ) {
List<CatchClause> catchStatements = ((TryCatchFinallyStatement)elem).getCatchStatements();
if( catchStatements != null ) {
for(CatchClause catchClause : catchStatements ) {
if( _strLocalVarName.equals(catchClause.getSymbol().getName())) {
return catchClause.getSymbol();
}
}
}
}
return findSymbol( elem.getParent() );
}
@Override
public String[] getDeclarations() {
return new String[]{_strLocalVarName};
}
@Override
public List<IGosuAnnotation> getAnnotations()
{
return getSymbol() == null
? Collections.<IGosuAnnotation>emptyList()
: getSymbol().getAnnotations();
}
}