/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir.transform.statement; import gw.internal.gosu.parser.ScopedDynamicSymbol; import gw.internal.gosu.ir.transform.ExpressionTransformer; import gw.internal.gosu.ir.transform.TopLevelTransformationContext; import gw.internal.gosu.ir.transform.util.AccessibilityUtil; import gw.lang.ir.IRStatement; import gw.lang.ir.IRExpression; import gw.lang.ir.expression.IRNotExpression; import gw.lang.ir.statement.IRNoOpStatement; import gw.lang.ir.statement.IRIfStatement; import gw.lang.parser.IExpression; import gw.lang.parser.ISymbol; import gw.lang.parser.IAttributeSource; import gw.lang.parser.expressions.IVarStatement; /** */ public class FieldInitializerTransformer extends AbstractStatementTransformer<IVarStatement> { public static IRStatement compile( TopLevelTransformationContext cc, IVarStatement stmt ) { FieldInitializerTransformer gen = new FieldInitializerTransformer( cc, stmt ); return gen.compile(); } private FieldInitializerTransformer( TopLevelTransformationContext cc, IVarStatement stmt ) { super( cc, stmt ); } @Override protected IRStatement compile_impl() { IExpression asExp = _stmt().getAsExpression(); ISymbol symbol = _stmt().getSymbol(); if( asExp != null ) { if( symbol instanceof ScopedDynamicSymbol ) { ScopedDynamicSymbol dynamicSymbol = (ScopedDynamicSymbol)symbol; IRExpression hasAttribute = callMethod( IAttributeSource.class, "hasAttribute", new Class[]{String.class}, pushAttributeSource( dynamicSymbol ), exprList( pushConstant( dynamicSymbol.getAttributeName() ) ) ); IRExpression value = boxValue( asExp.getType(), ExpressionTransformer.compile( asExp, _cc() ) ); IRExpression setAttribute = callMethod( IAttributeSource.class, "setAttribute", new Class[]{String.class, Object.class}, pushAttributeSource( dynamicSymbol ), exprList( pushConstant( dynamicSymbol.getAttributeName() ), value) ); return new IRIfStatement( new IRNotExpression( hasAttribute ), buildMethodCall( setAttribute ), null); } else { if( _stmt().isStatic() ) { return setStaticField( getGosuClass(), symbol.getName(), getDescriptor( symbol.getType() ), AccessibilityUtil.forSymbol( symbol ), ExpressionTransformer.compile( asExp, _cc() ) ); } else { return setInstanceField( getGosuClass(), symbol.getName(), getDescriptor( symbol.getType() ), AccessibilityUtil.forSymbol( symbol ), pushThis(), ExpressionTransformer.compile( asExp, _cc() ) ); } } } return new IRNoOpStatement(); } }