/interpreter/tags/at2dist220411/src/edu/vub/util/TempFieldGenerator.java

http://ambienttalk.googlecode.com/ · Java · 150 lines · 121 code · 23 blank · 6 comment · 12 complexity · d91c60b9815058f101dc89586d967312 MD5 · raw file

  1. package edu.vub.util;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Vector;
  5. import edu.vub.at.exceptions.InterpreterException;
  6. import edu.vub.at.exceptions.XSerializationError;
  7. import edu.vub.at.objects.ATObject;
  8. import edu.vub.at.objects.ATTypeTag;
  9. import edu.vub.at.objects.natives.NATText;
  10. /**
  11. * Uniquely maps ATObjects to their serialized version
  12. * and links them to a temporary name
  13. *
  14. * @author kpinte
  15. */
  16. public class TempFieldGenerator {
  17. private static final String PREFIX = "_v";
  18. private final Vector<ATObject> objects_;
  19. private final HashMap<ATObject, NATText> objectToCode_;
  20. private final HashMap<ATObject, NATText> objectToName_;
  21. private final HashMap<ATTypeTag, NATText> typeToCode_;
  22. private final HashMap<ATTypeTag, NATText> typeToName_;
  23. private int nameCounter_;
  24. private int quoteLevel_;
  25. public TempFieldGenerator() {
  26. objects_ = new Vector<ATObject>();
  27. objectToCode_ = new HashMap<ATObject, NATText>();
  28. objectToName_ = new HashMap<ATObject, NATText>();
  29. typeToCode_ = new HashMap<ATTypeTag, NATText>();
  30. typeToName_ = new HashMap<ATTypeTag, NATText>();
  31. nameCounter_ = 0;
  32. quoteLevel_ = 0;
  33. }
  34. private synchronized String generateName() {
  35. nameCounter_++;
  36. return PREFIX + nameCounter_;
  37. }
  38. public boolean inQuote() {
  39. return (quoteLevel_ > 0);
  40. }
  41. public boolean incQuoteLevel() {
  42. quoteLevel_++;
  43. return inQuote();
  44. }
  45. public boolean decQuoteLevel() throws XSerializationError {
  46. if (quoteLevel_ <= 0) {
  47. throw new XSerializationError("quote level below 0");
  48. }
  49. quoteLevel_--;
  50. return inQuote();
  51. }
  52. public NATText put(ATObject object, NATText code) {
  53. NATText name;
  54. if (this.contains(object)){
  55. name = objectToName_.get(object);
  56. } else {
  57. name = NATText.atValue(this.generateName());
  58. objects_.add(object);
  59. }
  60. objectToCode_.put(object, code);
  61. objectToName_.put(object, name);
  62. if (this.inQuote()) {
  63. return NATText.atValue("#" + name.javaValue);
  64. } else {
  65. return name;
  66. }
  67. }
  68. public NATText putType(ATTypeTag tt, NATText name, NATText code) {
  69. typeToCode_.put(tt, code);
  70. typeToName_.put(tt, name);
  71. if (this.inQuote()) {
  72. return NATText.atValue("#" + name.javaValue);
  73. } else {
  74. return name;
  75. }
  76. }
  77. public NATText getName(ATObject key) {
  78. NATText name = objectToName_.get(key);
  79. if (this.inQuote()) {
  80. return NATText.atValue("#" + name.javaValue);
  81. } else {
  82. return name;
  83. }
  84. }
  85. public NATText getTypeName(ATTypeTag tt) {
  86. NATText name = typeToName_.get(tt);
  87. if (this.inQuote()) {
  88. return NATText.atValue("#" + name.javaValue);
  89. } else {
  90. return name;
  91. }
  92. }
  93. public NATText getTypeCode(ATTypeTag tt) {
  94. return typeToCode_.get(tt);
  95. }
  96. public NATText getCode(ATObject key) {
  97. return objectToCode_.get(key);
  98. }
  99. public Boolean contains(ATObject object) {
  100. return objectToName_.containsKey(object);
  101. }
  102. public Boolean containsType(ATTypeTag tt) {
  103. return typeToName_.containsKey(tt);
  104. }
  105. public NATText generateCode(NATText targetName) throws InterpreterException {
  106. StringBuffer out = new StringBuffer("{");
  107. Iterator<ATTypeTag> tit = typeToName_.keySet().iterator();
  108. while (tit.hasNext()) {
  109. ATTypeTag tt = tit.next();
  110. NATText name = this.getTypeName(tt);
  111. NATText code = this.getTypeCode(tt);
  112. out.append(code.javaValue + "; ");
  113. };
  114. Iterator<ATObject> it = objects_.iterator();
  115. while(it.hasNext()) {
  116. ATObject key = it.next();
  117. NATText name = this.getName(key);
  118. NATText code = this.getCode(key);
  119. out.append("def " + name.javaValue + " := ");
  120. out.append(code.javaValue);
  121. out.append("; ");
  122. }
  123. out.append(targetName.javaValue);
  124. out.append("}()");
  125. return NATText.atValue(out.toString());
  126. }
  127. }