DefineNamespace.java 3.1 KB

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