KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > kawa > standard > define_member_alias


1 package kawa.standard;
2 import kawa.lang.*;
3 import gnu.lists.*;
4 import gnu.expr.*;
5 import gnu.kawa.reflect.*;
6 import gnu.bytecode.*;
7
8 public class define_member_alias extends Syntax
9 {
10   public static final define_member_alias define_member_alias
11     = new define_member_alias();
12   static { define_member_alias.setName("define-member-alias"); }
13
14
15   public boolean scanForDefinitions (Pair st, java.util.Vector JavaDoc forms,
16                                      ScopeExp defs, Translator tr)
17   {
18     Pair p;
19     if (! (st.cdr instanceof Pair)
20         || (tr.currentScope() instanceof ModuleExp)
21         || ! ((p = (Pair) st.cdr).car instanceof String JavaDoc))
22       return super.scanForDefinitions(st, forms, defs, tr);
23     Object JavaDoc name = p.car;
24     Declaration decl = defs.addDeclaration((String JavaDoc) name,
25                                            Compilation.typeSymbol);
26     decl.setIndirectBinding(true);
27     st = Translator.makePair(st, this, Translator.makePair(p, decl, p.cdr));
28     forms.addElement(st);
29     return true;
30   }
31
32   public Expression rewriteForm (Pair form, Translator tr)
33   {
34     Object JavaDoc obj = form.cdr;
35     Pair p1;
36     if (! (obj instanceof Pair)
37         || ! ((p1 = (Pair) obj).car instanceof String JavaDoc
38               || p1.car instanceof Declaration))
39       return tr.syntaxError("missing name in " + getName());
40     if (p1.cdr instanceof Pair)
41       {
42         String JavaDoc name;
43         Declaration decl;
44         if (p1.car instanceof Declaration)
45           {
46             decl = (Declaration) p1.car;
47             name = decl.getName();
48           }
49         else
50           {
51             name = (String JavaDoc) p1.car;
52             decl = null;
53           }
54         Pair p2 = (Pair) p1.cdr;
55         Expression fname = null;
56         Expression arg = tr.rewrite(p2.car);
57         if (p2.cdr == LList.Empty)
58           fname = new QuoteExp(gnu.expr.Compilation.mangleName(name));
59         else if (p2.cdr instanceof Pair)
60           {
61             Pair p3 = (Pair) p2.cdr;
62             if (p3.cdr == LList.Empty)
63               fname = tr.rewrite(p3.car);
64           }
65         if (fname != null)
66           {
67             ClassType t
68               = ClassType.make("gnu.kawa.reflect.ClassMemberConstraint");
69             Expression[] args = new Expression[3];
70             args[0] = new QuoteExp(name);
71             args[1] = arg;
72             args[2] = fname;
73             return Invoke.makeInvokeStatic(t, "define", args);
74           }
75       }
76     return tr.syntaxError("invalid syntax for " + getName());
77   }
78 }
79
Popular Tags