/** @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")); }
/** * 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; }
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; }
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"; }