diff options
Diffstat (limited to 'src/main/java/io/devnulllabs/openjava/ptree/util/VariableBinder.java')
-rw-r--r-- | src/main/java/io/devnulllabs/openjava/ptree/util/VariableBinder.java | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/main/java/io/devnulllabs/openjava/ptree/util/VariableBinder.java b/src/main/java/io/devnulllabs/openjava/ptree/util/VariableBinder.java new file mode 100644 index 0000000..05f03d7 --- /dev/null +++ b/src/main/java/io/devnulllabs/openjava/ptree/util/VariableBinder.java @@ -0,0 +1,115 @@ +/* + * VariableBinder.java + * + * comments here. + * + * @author Michiaki Tatsubori + * @version %VERSION% %DATE% + * @see java.lang.Object + * + * COPYRIGHT 1998 by Michiaki Tatsubori, ALL RIGHTS RESERVED. + */ +package io.devnulllabs.openjava.ptree.util; + +import io.devnulllabs.openjava.mop.Environment; +import io.devnulllabs.openjava.mop.OJClass; +import io.devnulllabs.openjava.mop.OJClassNotFoundException; +import io.devnulllabs.openjava.ptree.ForStatement; +import io.devnulllabs.openjava.ptree.Parameter; +import io.devnulllabs.openjava.ptree.ParseTreeException; +import io.devnulllabs.openjava.ptree.Statement; +import io.devnulllabs.openjava.ptree.TypeName; +import io.devnulllabs.openjava.ptree.VariableDeclaration; +import io.devnulllabs.openjava.ptree.VariableDeclarator; +import io.devnulllabs.openjava.tools.DebugOut; + +/** + * The class <code>VariableBinder</code> + * <p> + * For example + * <pre> + * </pre> + * <p> + * + * @author Michiaki Tatsubori + * @version 1.0 + * @since $Id: VariableBinder.java,v 1.2 2003/02/19 02:55:00 tatsubori Exp $ + * @see java.lang.Object + */ +public class VariableBinder extends ScopeHandler { + + public VariableBinder(Environment env) { + super(env); + } + + public Statement evaluateDown(VariableDeclaration ptree) + throws ParseTreeException { + super.evaluateDown(ptree); + bindLocalVariable(ptree, getEnvironment()); + + return ptree; + } + + public Statement evaluateDown(ForStatement ptree) + throws ParseTreeException { + super.evaluateDown(ptree); + TypeName tspec = ptree.getInitDeclType(); + if (tspec == null) + return ptree; + VariableDeclarator[] vdecls = ptree.getInitDecls(); + bindForInit(tspec, vdecls, getEnvironment()); + + return ptree; + } + + public Parameter evaluateDown(Parameter ptree) throws ParseTreeException { + super.evaluateDown(ptree); + bindParameter(ptree, getEnvironment()); + + return ptree; + } + + private static void bindLocalVariable( + VariableDeclaration var_decl, + Environment env) { + String type = var_decl.getTypeSpecifier().toString(); + String name = var_decl.getVariable(); + bindName(env, type, name); + } + + private static void bindForInit( + TypeName tspec, + VariableDeclarator[] vdecls, + Environment env) { + for (int i = 0; i < vdecls.length; ++i) { + String type = tspec.toString() + vdecls[i].dimensionString(); + String name = vdecls[i].getVariable(); + bindName(env, type, name); + } + } + + private static void bindParameter(Parameter param, Environment env) { + String type = param.getTypeSpecifier().toString(); + String name = param.getVariable(); + bindName(env, type, name); + } + + private static void bindName(Environment env, String type, String name) { + String qtypename = env.toQualifiedName(type); + try { + OJClass clazz = env.lookupClass(qtypename); + if (clazz == null) + clazz = OJClass.forName(qtypename); + env.bindVariable(name, clazz); + DebugOut.println("binds variable\t" + name + "\t: " + qtypename); + } catch (OJClassNotFoundException e) { + System.err.println( + "VariableBinder.bindName() " + + e.toString() + + " : " + + qtypename); + System.err.println(env); + } + } + +} |