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