1 package kawa.standard; 2 import kawa.lang.*; 3 import gnu.expr.*; 4 import gnu.lists.*; 5 import gnu.mapping.Symbol; 6 7 public class module_name extends Syntax 8 { 9 public static final module_name module_name = new module_name(); 10 static { module_name.setName("module-name"); } 11 12 public void scanForm (Pair form, ScopeExp defs, Translator tr) 13 { 14 Object form_cdr = form.cdr; 15 SyntaxForm nameSyntax = null; 16 while (form_cdr instanceof SyntaxForm) 17 { 18 nameSyntax = (SyntaxForm) form_cdr; 19 form_cdr = nameSyntax.form; 20 } 21 Object arg = form_cdr instanceof Pair ? ((Pair) form_cdr).car : null; 22 while (arg instanceof SyntaxForm) 23 { 24 nameSyntax = (SyntaxForm) arg; 25 arg = nameSyntax.form; 26 } 27 String name = null; 28 Pair p; 29 String err = null; 30 Declaration decl = null; 31 if (arg instanceof Pair && (p = (Pair) arg).car == "quote") 32 { 33 arg = p.cdr; 34 if (! (arg instanceof Pair) 35 || (p = (Pair) arg).cdr != LList.Empty 36 || ! (p.car instanceof String )) 37 err = "invalid quoted symbol for 'module-name'"; 38 else 39 name = (String ) p.car; 40 } 41 else if (arg instanceof FString) 42 name = arg.toString(); 43 else if (arg instanceof String || arg instanceof Symbol) 44 { 45 name = arg.toString(); 46 int len = name.length(); 47 if (len > 2 48 && name.charAt(0) == '<' 49 && name.charAt(len-1) == '>') 50 { 51 name = name.substring(1, len-1); 52 decl = tr.define(arg, nameSyntax, defs); 53 } 54 else 55 err = "not implemented: plain name in module-name"; 56 } 57 else 58 err = "un-implemented expression in module-name"; 59 if (err != null) 60 tr.formStack.add(tr.syntaxError(err)); 61 else 62 { 63 int index = name.lastIndexOf('.'); 64 String className = name; 65 if (index >= 0) 66 tr.classPrefix = name.substring(0, index+1); 67 else 68 { 69 name = tr.classPrefix + name; 70 className = tr.classPrefix + Compilation.mangleName(name); 71 } 72 ModuleExp module = tr.getModule(); 73 if (tr.mainClass == null) 74 tr.mainClass = new gnu.bytecode.ClassType(className); 75 else 76 { 77 String oldName = tr.mainClass.getName(); 78 if (oldName == null) 79 tr.mainClass.setName(className); 80 else if (! oldName.equals(className)) 81 tr.syntaxError("duplicate module-name: old name: "+oldName); 82 } 83 module.setType(tr.mainClass); 84 module.setName(name); 85 86 if (decl != null) 87 { 88 decl.noteValue(module); 89 decl.setFlag(Declaration.IS_CONSTANT|Declaration.PRIVATE_SPECIFIED); 90 decl.setPrivate(true); 91 decl.setType(Compilation.typeClassType); 92 } 93 tr.mustCompileHere(); 94 } 95 } 96 } 97 | Popular Tags |