1 package gnu.kawa.lispexpr;
2 import kawa.lang.*;
3 import gnu.expr.*;
4 import gnu.mapping.*;
5 import gnu.lists.*;
6 import gnu.bytecode.ClassType;
7 import gnu.kawa.xml.XmlNamespace;
8 
9 public class DefineNamespace extends Syntax
10 {
11   private boolean makePrivate;
12   private boolean makeXML;
13 
14   public static final DefineNamespace define_namespace
15     = new DefineNamespace();
16   public static final DefineNamespace define_private_namespace
17     = new DefineNamespace();
18   public static final DefineNamespace define_xml_namespace
19     = new DefineNamespace();
20   static {
21     define_namespace.setName("define-namespace");
22     define_private_namespace.setName("define-private-namespace");
23     define_private_namespace.makePrivate = true;
24     define_xml_namespace.setName("define-xml-namespace");
25     define_xml_namespace.makeXML = true;
26   }
27 
28   @Override
scanForDefinitions(Pair st, ScopeExp defs, Translator tr)29   public boolean scanForDefinitions(Pair st, ScopeExp defs, Translator tr)
30   {
31     Pair p1, p2;
32     if (! (st.getCdr() instanceof Pair)
33         || ! ((p1 = (Pair) st.getCdr()).getCar() instanceof Symbol)
34 	|| ! (p1.getCdr() instanceof Pair)
35 	|| (p2 = (Pair) p1.getCdr()).getCdr() != LList.Empty)
36       {
37 	tr.error('e', "invalid syntax for define-namespace");
38 	return false;
39       }
40     Symbol name = (Symbol) p1.getCar();
41     Declaration decl = defs.getDefine(name, tr);
42     tr.push(decl);
43     decl.setFlag(Declaration.IS_CONSTANT|Declaration.IS_NAMESPACE_PREFIX
44                  |Declaration.IS_SINGLE_VALUE);
45     if (makePrivate)
46       {
47         decl.setFlag(Declaration.PRIVATE_SPECIFIED);
48         decl.setPrivate(true);
49       }
50     else if (defs instanceof ModuleExp)
51       decl.setCanRead(true);
52     Translator.setLine(decl, p1);
53     Expression value;
54     String literal = null;
55     if
56       /* #ifdef use:java.lang.CharSequence */
57       (p2.getCar() instanceof CharSequence)
58       /* #else */
59       // (p2.getCar() instanceof CharSeq || p2.getCar() instanceof String)
60       /* #endif */
61       {
62         literal = p2.getCar().toString();
63         Namespace namespace;
64         String prefix = name.getName();
65         if (literal.startsWith("class:"))
66           {
67             String cname = literal.substring(6);
68             namespace
69               = ClassNamespace.getInstance(literal, ClassType.make(cname));
70             decl.setType(ClassType.make("gnu.kawa.lispexpr.ClassNamespace"));
71           }
72         else if (makeXML)
73           {
74             namespace = XmlNamespace.getInstance(prefix, literal);
75             decl.setType(ClassType.make("gnu.kawa.xml.XmlNamespace"));
76           }
77         else
78           {
79             namespace = Namespace.valueOf(literal, prefix);
80             decl.setType(ClassType.make("gnu.mapping.Namespace"));
81           }
82         value = new QuoteExp(namespace);
83 	decl.setFlag(Declaration.TYPE_SPECIFIED);
84        }
85     else
86       value = tr.rewrite_car (p2, false);
87     decl.noteValue(value);
88     tr.pushForm(SetExp.makeDefinition(decl, value));
89     return true;
90   }
91 
rewriteForm(Pair form, Translator tr)92   public Expression rewriteForm (Pair form, Translator tr)
93   {
94     return tr.syntaxError ("define-namespace is only allowed in a <body>");
95   }
96 
97   public static final String XML_NAMESPACE_MAGIC = "&xml&";
98 }
99