예제 #1
0
  /** @brief Generates the signature for the class constructors */
  private static void generateSignature(IndentWriter writer, IXMLElement constructor)
      throws IOException {
    assert (DebugMsg.debugMsg("ClassWriter", "Begin ClassWriter::generateSignature"));
    writer.write("constructor(");
    boolean comma = false;
    for (Enumeration e = constructor.enumerateChildren(); e.hasMoreElements(); ) {
      IXMLElement element = (IXMLElement) e.nextElement();
      if (!element.getName().equals("arg")) {
        break;
      }
      String argType = XMLUtil.typeOf(element);
      String argName = XMLUtil.getAttribute(element, "name");
      if (comma) {
        writer.write(", ");
      }

      // Argument are structured as: <arg name="argName" type="argType"/>
      if (argType.equals(NddlXmlStrings.x_int)) writer.write("int " + argName);
      else if (argType.equals(NddlXmlStrings.x_float)) writer.write("double " + argName);
      else if (argType.equals(NddlXmlStrings.x_boolean)) writer.write("bool " + argName);
      else if (argType.equals(NddlXmlStrings.x_string)
          || argType.equals(NddlXmlStrings.x_symbol)
          || ModelAccessor.isEnumeration(argType)) writer.write("const LabelStr& " + argName);
      else writer.write("const " + argType + "Id& " + argName);

      comma = true;
    }
    writer.write(")");
    assert (DebugMsg.debugMsg("ClassWriter", "End ClassWriter::generateSignature"));
  }
예제 #2
0
  /**
   * Builds the argument invocation string for calling a constructor
   *
   * @param classVariables The collection of member variables as XMLElements
   * @param constructorArguments The set of names for constructor arguments
   * @param allocatedMemberVariables The set of member variables already allocated
   * @param element The specific 'new' xml element
   */
  private static String buildArguments(
      Vector classVariables,
      Set constructorArguments,
      Set allocatedMemberVariables,
      IXMLElement element)
      throws IOException {
    XMLUtil.checkExpectedNode("new", element);

    boolean comma = false;
    String arguments = "";
    for (Enumeration e = element.enumerateChildren(); e.hasMoreElements(); ) {
      IXMLElement argument = (IXMLElement) e.nextElement();
      String argType = ModelAccessor.getValueType(argument);
      String value = ModelAccessor.getValue(argument);

      /* Exclude cases where we do nothing to the value */
      if (!primitives.contains(argType) && !value.equals("true") && !value.equals("false")) {
        // CASE 0: Translate 'this'
        if (value.equalsIgnoreCase("this")) {
          value = "m_id";
        }

        // CASE 1: It is a singleton member variable which must be mapped to the singleton
        else if (allocatedMemberVariables.contains(value)) {
          String singletonType = getVariableType(classVariables, value);
          if (primitives.contains(singletonType)) {
            value = "(" + singletonType + ") singleton(" + value + ")";
          } else value = "singleton(" + value + ")";
        }

        // CASE 2: It is a constructor argument
        else if (constructorArguments.contains(value)) { // Do nothing, just use the string as is.
        }

        // CASE 3: Test for error - using a member before initializing it
        else if (!allocatedMemberVariables.contains(value) && isMember(classVariables, value)) {
          value = "!ERROR: Cannot use " + value + " without prior initialization.";
        }

        // Otherwise it is a string or enumerataion
        else if (argType.equals("string")
            || // It is an enumeartion of some kind
            ModelAccessor.isEnumeration(argType)
            || argType.equals("symbol")) {
          value = "LabelStr(\"" + XMLUtil.escapeQuotes(value) + "\")";
        }

        // If we fall through to here, there is an error.
        else value = "!ERROR:BAD ASSIGNMENT";
      }

      // CASE 3: It is a true or false value
      if (comma) arguments = arguments + ", ";

      arguments = arguments + value;
      comma = true;
    }

    return arguments;
  }
예제 #3
0
 private static String getVariableType(Vector classVariables, String name) {
   String type = "!ERROR";
   for (int i = 0; i < classVariables.size(); i++) {
     IXMLElement variable = (IXMLElement) classVariables.elementAt(i);
     if (XMLUtil.nameOf(variable).equals(name)) {
       type = XMLUtil.getAttribute(variable, "type");
       String _class = XMLUtil.getAttribute(variable.getParent(), "name");
       if (ModelAccessor.isEnumeration(_class + "::" + type)) type = _class + "::" + type;
       break;
     }
   }
   return type;
 }
예제 #4
0
 private static String makeArgumentType(String argType) {
   if (primitives.contains(argType)) return argType;
   else if (argType.equals("string") || ModelAccessor.isEnumeration(argType)) return "LabelStr";
   else return argType + "Id";
 }