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