summaryrefslogtreecommitdiff
path: root/src/main/java/io/devnulllabs/openjava/ptree/util/VariableBinder.java
blob: 05f03d77587b5fb32fb484ec4fd9e2c21490598e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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);
        }
    }

}