Initial implementation of symbols and scopes with symbol table.
[charm.git] / src / langs / charj / src / charj / translator / MethodSymbol.java
1
2 package charj.translator;
3
4 import org.antlr.stringtemplate.StringTemplate;
5 import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
6
7 import java.util.LinkedHashMap;
8 import java.util.Map;
9
10 public class MethodSymbol 
11     extends SymbolWithScope 
12     implements Scope {
13     /** The enclosing class */
14     Scope enclosingScope;
15
16     /** The formal argument list scope */
17     LinkedHashMap<String, VariableSymbol> orderedArgs = new LinkedHashMap();
18
19     /** The list of local variables defined anywhere in the method */
20     LocalScope locals;
21
22     public boolean isStatic = false;
23     public boolean isCtor = false;
24
25     public MethodSymbol(SymbolTable symtab) 
26     { 
27         super(symtab); 
28     }
29
30     public MethodSymbol(
31             SymbolTable symtab, 
32             String name,
33             Scope enclosingScope,
34             ClassSymbol retType)
35     {
36         super(symtab, name);
37         this.enclosingScope = enclosingScope;
38         this.type = retType;
39     }
40
41     public VariableSymbol defineArg(
42             String name, 
43             ClassSymbol type) 
44     {
45         if ( orderedArgs.get(name)!=null ) {
46             return null;
47         }
48         VariableSymbol vs = new VariableSymbol(symtab,name,type);
49         define(name, vs);
50         return vs;
51     }
52
53     public Scope getEnclosingScope() 
54     {
55         return enclosingScope;
56     }
57
58     public LocalScope getLocalScope() 
59     {
60         return locals;
61     }
62
63     public void setLocalScope(LocalScope s)
64     {
65         locals = s;
66     }
67
68     public String getScopeName() 
69     {
70         return SymbolTable.mangle(name);
71     }
72
73     public Map createMembers() 
74     {
75         if ( orderedArgs==null ) {
76             orderedArgs = new LinkedHashMap();
77         }
78         return orderedArgs;
79     }
80
81     public Map getMembers() 
82     {
83         return orderedArgs;
84     }
85
86     public String signature() 
87     {
88         return null;
89     }
90
91     public String toString() 
92     {
93         StringTemplate st = new StringTemplate(
94                 "<if(parent)><parent>::<endif><name>(<args; separator=\",\">)" +
95                 "<if(locals)>{<locals; separator=\",\">}<endif>",
96                 AngleBracketTemplateLexer.class);
97         st.setAttribute("parent", enclosingScope.getScopeName());
98         st.setAttribute("name", name);
99         st.setAttribute("args", orderedArgs);
100         st.setAttribute("locals", locals!=null?locals.getMembers():null);
101         return st.toString();
102     }
103
104     public int hashCode() 
105     {
106         return name.hashCode() + orderedArgs.size() + enclosingScope.hashCode();
107     }
108
109     /** Two methods are equals() when they have the same name and
110      *  the same number of arguments in the same scope.
111      */
112     public boolean equals(Object object) 
113     {
114         return name.equals(((MethodSymbol)object).name) &&
115             orderedArgs.size()==((MethodSymbol)object).orderedArgs.size() &&
116             enclosingScope == ((MethodSymbol)object).enclosingScope;
117     }
118
119     public String getMangledName() 
120     {
121         String mangled = name;
122         boolean isCtor = name.equals(enclosingScope.getScopeName());
123         if ( SymbolTable.METHOD_NAMES_TO_MANGLE.contains(name) ||
124                 (isCtor && SymbolTable.TYPE_NAMES_TO_MANGLE.contains(name)) ) {
125             mangled = "cj" + mangled;
126         }
127         int numargs = getMembers().size();
128         if ( numargs > 0 && !isCtor ) {
129             mangled += numargs;
130         }
131         return mangled;
132     }
133 }