/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform;
import gw.internal.gosu.parser.DynamicFunctionSymbol;
import gw.internal.gosu.parser.TypeVariableType;
import gw.internal.gosu.parser.IGosuEnhancementInternal;
import gw.internal.gosu.parser.ICompilableTypeInternal;
import gw.internal.gosu.parser.expressions.InitializerAssignment;
import gw.lang.ir.IRSymbol;
import gw.lang.ir.IRType;
import gw.lang.ir.IRStatement;
import gw.lang.ir.IRExpression;
import gw.lang.parser.IStatement;
import gw.lang.parser.IBlockClass;
import gw.lang.reflect.IType;
import gw.lang.reflect.gs.IGosuProgram;
import gw.lang.reflect.java.JavaTypes;
import gw.util.Stack;
import java.util.List;
public abstract class TransformationContextBase implements TopLevelTransformationContext {
private FunctionBodyTransformationContext _bodyContext;
private ICompilableTypeInternal _compilingType;
protected TransformationContextBase( ICompilableTypeInternal compilingType ) {
_compilingType = compilingType;
}
public void initBodyContext( boolean isStatic ) {
_bodyContext = new FunctionBodyTransformationContext( this, isStatic );
}
public void initBodyContext( boolean isStatic, DynamicFunctionSymbol dfs ) {
_bodyContext = new DFSFunctionBodyTransformationContext( this, isStatic, dfs );
}
// We good
@Override
public IRStatement compile( IStatement stmt ) {
return StatementTransformer.compile( this, stmt );
}
@Override
public IRStatement compileInitializerAssignment( InitializerAssignment stmt, IRExpression root ) {
return StatementTransformer.compileInitializerAssignment(this, stmt, root);
}
@Override
public boolean currentlyCompilingBlock()
{
return false;
}
@Override
public ICompilableTypeInternal getGosuClass() {
return _compilingType;
}
@Override
public IType getSuperType() {
return _compilingType.getSupertype() == null
? JavaTypes.OBJECT()
: _compilingType.getSupertype();
}
@Override
public ICompilableTypeInternal getEnclosingType() {
return _compilingType.getEnclosingType();
}
@Override
public boolean isNonStaticInnerClass() {
return !_compilingType.isStatic() && _compilingType.getEnclosingType() != null;
}
@Override
public boolean compilingEnhancement() {
return _compilingType instanceof IGosuEnhancementInternal;
}
@Override
public boolean compilingEnum() {
return _compilingType.isEnum();
}
@Override
public boolean compilingBlock() {
return _compilingType instanceof IBlockClass;
}
@Override
public boolean compilingProgram() {
return _compilingType instanceof IGosuProgram;
}
// Methods that rely on the FunctionBodyTransformationContext
@Override
public IRSymbol makeAndIndexTempSymbol( IRType type ) {
return _bodyContext.makeAndIndexTempSymbol( type );
}
public IRSymbol makeAndIndexTempSymbol( String strNameSuffix, IRType type ) {
return _bodyContext.makeAndIndexTempSymbol( strNameSuffix, type );
}
@Override
public IRSymbol getTypeParamIndex( TypeVariableType type ) {
return _bodyContext.getTypeParamIndex( type );
}
@Override
public IRSymbol getSymbol(String symbolName) {
return _bodyContext.getSymbol( symbolName );
}
@Override
public boolean hasSymbol( String strSymbol ) {
return _bodyContext.hasSymbol( strSymbol );
}
@Override
public void pushScope( boolean bInitialInstanceMethodScope ) {
_bodyContext.pushScope( bInitialInstanceMethodScope );
}
@Override
public void popScope() {
_bodyContext.popScope();
}
@Override
public void putSymbol(IRSymbol symbol) {
_bodyContext.putSymbol( symbol );
}
@Override
public void putSymbols(List<IRSymbol> symbols) {
_bodyContext.putSymbols(symbols);
}
@Override
public String makeTempSymbolName() {
return _bodyContext.makeTempSymbolName();
}
@Override
public boolean isBlockInvoke() {
return _bodyContext.isBlockInvoke();
}
@Override
public IRSymbol createSymbol(String name, IRType type) {
return _bodyContext.createSymbol( name, type );
}
@Override
public boolean hasSuperBeenInvoked() {
return _bodyContext.hasSuperBeenInvoked();
}
@Override
public void markSuperInvoked() {
_bodyContext.markSuperInvoked();
}
@Override
public void updateSuperInvokedAfterLastExpressionCompiles() {
_bodyContext.updateSuperInvokedAfterLastExpressionCompiles();
}
@Override
public Stack<IRScope> getScopes() {
return _bodyContext.getScopes();
}
// These methods should all be rolled directly onto FunctionBodyContext, I believe
@Override
public String getCurrentFunctionName() {
DynamicFunctionSymbol functionSymbol = _bodyContext.getCurrentDFS();
return (functionSymbol == null ? null : functionSymbol.getName());
}
@Override
public DynamicFunctionSymbol getCurrentFunction() {
return _bodyContext.getCurrentDFS();
}
@Override
public boolean isCurrentFunctionStatic() {
return _bodyContext.isStatic();
}
@Override
public IType getCurrentFunctionReturnType() {
DynamicFunctionSymbol functionSymbol = _bodyContext.getCurrentDFS();
return (functionSymbol == null ? null : functionSymbol.getReturnType());
}
}