/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser.expressions; import gw.internal.gosu.parser.Expression; import gw.internal.gosu.parser.ParseTree; import gw.internal.gosu.parser.Statement; import gw.internal.gosu.parser.CannotExecuteGosuException; import gw.lang.parser.IDynamicFunctionSymbol; import gw.lang.parser.IParseIssue; import gw.lang.parser.IParsedElement; import gw.lang.parser.IParsedElementWithAtLeastOneDeclaration; import gw.lang.parser.expressions.IProgram; import gw.lang.reflect.IType; import java.util.List; import java.util.Map; /** * An expression representing a Program: * * @see gw.lang.parser.IGosuParser */ public class Program extends Expression implements IProgram { private Statement _mainStatement; private Map<String, IDynamicFunctionSymbol> _functions; private IType _declaredReturnType; /** * Constructs a Program given an ISymbolTable instance. */ public Program() { } public Statement getMainStatement() { return _mainStatement; } public void setMainStatement( Statement mainStatement ) { _mainStatement = mainStatement; } public Map getFunctions() { return _functions; } public void setFunctions( Map functions ) { //noinspection unchecked _functions = functions; } public IType getDeclaredReturnType() { return _declaredReturnType; } public void setDeclaredReturnType(IType declaredReturnType) { _declaredReturnType = declaredReturnType; } public Object evaluate() { if( !isCompileTimeConstant() ) { return super.evaluate(); } throw new CannotExecuteGosuException(); } @Override public void addParseWarning( IParseIssue warning ) { if (_mainStatement != null) { super.addParseWarning(warning); } } @Override public ParseTree getLocation() { if( _mainStatement != null ) { return _mainStatement.getLocation(); } return super.getLocation(); } @Override public String toString() { if( _mainStatement != null ) { return _mainStatement.toString(); } return "<empty>"; } @Override public IType getReturnType() { if (_declaredReturnType != null) { return _declaredReturnType; } if( _mainStatement != null ) { return _mainStatement.getReturnType(); } return null; } public boolean hasContent() { Statement mainStatement = getMainStatement(); return mainStatement != null && mainStatement.hasContent(); } @Override public <E extends IParsedElement> boolean getContainedParsedElementsByType( Class<E> parsedElementType, List<E> listResults ) { return _mainStatement.getContainedParsedElementsByType( parsedElementType, listResults ); } @Override public IParsedElementWithAtLeastOneDeclaration findDeclaringStatement( IParsedElement element, String identifierName ) { return _mainStatement.findDeclaringStatement( element, identifierName ); } @Override public List<IParseIssue> getParseIssues() { if( _mainStatement != null ) { return _mainStatement.getParseIssues(); } return super.getParseIssues(); } @Override public List<IParseIssue> getImmediateParseIssues() { if( _mainStatement != null ) { return _mainStatement.getImmediateParseIssues(); } return super.getImmediateParseIssues(); } @Override public boolean hasParseExceptions() { if( _mainStatement != null ) { return _mainStatement.hasParseExceptions(); } return super.hasParseExceptions(); } @Override public List<IParseIssue> getParseExceptions() { if( _mainStatement != null ) { return _mainStatement.getParseExceptions(); } return super.getParseExceptions(); } @Override public List<IParseIssue> getParseWarnings() { if( _mainStatement != null ) { return _mainStatement.getParseWarnings(); } return super.getParseWarnings(); } @Override public boolean hasParseWarnings() { if( _mainStatement != null ) { return _mainStatement.hasParseWarnings(); } return super.hasParseWarnings(); } }