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 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 )) 22 return super.scanForDefinitions(st, forms, defs, tr); 23 Object name = p.car; 24 Declaration decl = defs.addDeclaration((String ) 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 obj = form.cdr; 35 Pair p1; 36 if (! (obj instanceof Pair) 37 || ! ((p1 = (Pair) obj).car instanceof String 38 || p1.car instanceof Declaration)) 39 return tr.syntaxError("missing name in " + getName()); 40 if (p1.cdr instanceof Pair) 41 { 42 String 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 ) 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 |