ResolveNamespace.java 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // Copyright (c) 2010 Per M.A. Bothner
  2. // This is free software; for terms and warranty disclaimer see ../../../COPYING.
  3. package gnu.kawa.lispexpr;
  4. import gnu.expr.*;
  5. import gnu.lists.*;
  6. import gnu.mapping.Namespace;
  7. import kawa.lang.*;
  8. public class ResolveNamespace extends Syntax
  9. {
  10. public static final ResolveNamespace resolveNamespace =
  11. new ResolveNamespace("$resolve-namespace$", false);
  12. public static final ResolveNamespace resolveQName =
  13. new ResolveNamespace("$resolve-qname$", true);
  14. boolean resolvingQName;
  15. public ResolveNamespace(String name, boolean resolvingQName)
  16. {
  17. super(name);
  18. this.resolvingQName = resolvingQName;
  19. }
  20. public Expression rewriteForm (Pair form, Translator tr) {
  21. Object cdr = form.getCdr();
  22. String local;
  23. if (resolvingQName) {
  24. // look for name [prefix]
  25. Pair pair = (Pair) cdr;
  26. local = pair.getCar().toString();
  27. cdr = pair.getCdr();
  28. }
  29. else
  30. local = null;
  31. if (! (cdr instanceof Pair))
  32. cdr = LList.list1(ReaderXmlElement.defaultElementNamespaceSymbol);
  33. Pair pair = (Pair) cdr;
  34. Expression prefix = tr.rewrite_car(pair, false);
  35. Namespace namespace = tr.namespaceResolvePrefix(prefix);
  36. if (namespace == null) {
  37. String pstr = pair.getCar().toString();
  38. if (pstr == ReaderXmlElement.DEFAULT_ELEMENT_NAMESPACE)
  39. namespace = Namespace.EmptyNamespace;
  40. else {
  41. Object savePos = tr.pushPositionOf(pair);
  42. tr.error('e', "unknown namespace prefix "+pstr);
  43. tr.popPositionOf(savePos);
  44. namespace = Namespace.valueOf(pstr, pstr);
  45. }
  46. }
  47. if (resolvingQName)
  48. return new QuoteExp(namespace.getSymbol(local));
  49. else
  50. return new QuoteExp(namespace);
  51. }
  52. }