/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.lang.ir.builder.expression;
import gw.lang.UnstableAPI;
import gw.lang.ir.IJavaClassIRType;
import gw.lang.ir.IRExpression;
import gw.lang.ir.IRType;
import gw.lang.ir.builder.IRBuilderContext;
import gw.lang.ir.builder.IRExpressionBuilder;
import gw.lang.ir.expression.IRFieldGetExpression;
import gw.lang.ir.statement.IRFieldDecl;
import gw.lang.reflect.java.IJavaClassField;
@UnstableAPI
public class IRFieldGetExpressionBuilder extends IRExpressionBuilder {
private BuilderImpl _builder;
public IRFieldGetExpressionBuilder(IRExpressionBuilder root, String name) {
_builder = new RootAndNameBuilder(root, name);
}
@Override
protected IRExpression buildImpl(IRBuilderContext context) {
return _builder.buildImpl(context);
}
private static interface BuilderImpl {
IRFieldGetExpression buildImpl(IRBuilderContext context);
}
private static final class RootAndNameBuilder implements BuilderImpl {
private IRExpressionBuilder _root;
private String _name;
private RootAndNameBuilder(IRExpressionBuilder root, String name) {
_root = root;
_name = name;
}
@Override
public IRFieldGetExpression buildImpl(IRBuilderContext context) {
IRExpression root = _root.build(context);
IRType rootType = root.getType();
if ( rootType instanceof IJavaClassIRType) {
IJavaClassField field = findField( ((IJavaClassIRType)rootType).getJavaClassInfo(), _name );
return new IRFieldGetExpression(root, _name, getIRType(field.getType()), getIRType(field.getEnclosingClass()));
} else if ( rootType.equals( context.owningType() ) ) {
IRFieldDecl field = context.findField(_name);
return new IRFieldGetExpression(root, _name, field.getType(), context.owningType() );
} else {
throw new IllegalArgumentException("Cannot reference a field only by name on a root expression that's not an IJavaClassIRType");
}
}
}
}