internal static void GenIDL_Preview(Repository repository, TextOutputInterface output, HashSet<string> uncheckedElem, String fullPath) { char[] delimiterChars = { '\\'}; String[] elementNames = fullPath.Split(delimiterChars); String pathToElement = ""; if (elementNames.Length <= 1) { GenIDL(repository, true, output, uncheckedElem); return; } Package package = (Package)EAUtil_FindChild(repository.Models, elementNames[0]); if (package == null) { output.OutputTextLine("// Could not find selected package: \"" + fullPath + "\" in the model"); return; } Package parentPackage = package; Element classElem = null; for (int i = 1; i < elementNames.Length; ++i, parentPackage = package) { String elemName = elementNames[i]; package = (Package)EAUtil_FindChild(parentPackage.Packages, elemName); if ((package == null) && (i == elementNames.Length - 1)) { classElem = (Element)EAUtil_FindChild(parentPackage.Elements, elemName); } } output.Clear(); if (package == null && classElem == null) { output.OutputTextLine("// Could not find selected element: \"" + fullPath + "\" in the model"); return; } pathToElement = elementNames[0]; for (int i = 1; i < elementNames.Length - 1; ++i) { output.OutputText("module " + IDL_NormalizeUserDefinedClassifierName(elementNames[i]) + " { "); pathToElement += "\\" + elementNames[i]; } output.OutputTextLine(); if (package != null) { // display package // output.OutputTextLine("Displaying Package: " + package.Name); Dictionary<long, bool> moduleRelevance = new Dictionary<long, bool>(); HashSet<long> dummyCompletedClases = new HashSet<long>(); UpdateModuleRelevance(moduleRelevance, package, output); Main.GenIDL_ModuleFirstPass(repository, package, true, output, elementNames.Length - 1, pathToElement, uncheckedElem, moduleRelevance, null); int generatedItemCount; Main.GenIDL_ModuleSecondPass(repository, package, true, output, elementNames.Length - 1, pathToElement, out generatedItemCount, uncheckedElem, moduleRelevance, dummyCompletedClases); } else if (classElem != null) { // display class // output.OutputTextLine("Displaying Class: " + classElem.Name); if (IsElementEnum(classElem)) { Main.GenIDL_Enum(repository, classElem, output, elementNames.Length - 1, uncheckedElem, pathToElement); } else { Main.GenIDL_Class(repository, classElem, output, elementNames.Length - 1, uncheckedElem, pathToElement); } } for (int i = 1; i < elementNames.Length - 1; ++i) { output.OutputText("};"); } }
internal static void GenIDL(Repository repository, bool isPreview, TextOutputInterface output, HashSet<String> uncheckedElem) { output.Clear(); output.OutputTextLine("/* ******************************************************************* */"); output.OutputTextLine("/* These are UML builtin primitive types that are not primitive in IDL */"); GenIDL_PrebuiltUMLTypes(output); output.OutputTextLine(""); output.OutputTextLine("/* ******************************************************************* */"); output.OutputTextLine("/* These are Types defined in the model */"); output.OutputTextLine(""); // moduleRelevance holds the modules relevant for IDL generation Dictionary<long, bool> moduleRelevance = new Dictionary<long, bool>(); // completedClasses holds the classes for which code has been completely generated // such that we can generate code that depends on these classes HashSet<long> completedClasses = new HashSet<long>(); foreach (Package model in repository.Models) { if ((!isPreview) && uncheckedElem.Contains(model.Name)) { // if unckecked skip this model continue; } UpdateModuleRelevance(moduleRelevance, model, output); } foreach (Package model in repository.Models) { if ((!isPreview) && uncheckedElem.Contains(model.Name)) { // if unckecked skip this model continue; } output.OutputTextLine("/* ----- Model: \"" + model.Name + "\" ----- */"); foreach (Package package in model.Packages) { GenIDL_ModuleFirstPass(repository, package, false, output, 0, model.Name, uncheckedElem, moduleRelevance, completedClasses); } } int notGeneratedClassCount = -1; // Does not matter as long as it is < 0 int previousNotGeneratedClassCount; do { previousNotGeneratedClassCount = notGeneratedClassCount; notGeneratedClassCount = 0; foreach (Package model in repository.Models) { if ((!isPreview) && uncheckedElem.Contains(model.Name)) { // if unckecked skip this model continue; } foreach (Package package in model.Packages) { int generatedItemCount; notGeneratedClassCount += GenIDL_ModuleSecondPass(repository, package, false, output, 0, model.Name, out generatedItemCount, uncheckedElem, moduleRelevance, completedClasses); } } } while ( (notGeneratedClassCount > 0) && (notGeneratedClassCount != previousNotGeneratedClassCount) ) ; if (notGeneratedClassCount > 0 ) { output.OutputTextLine("/* WARNING: " + notGeneratedClassCount + " classes could not be generated due to circular dependencies */"); GenIDL_ReportUngeneratedClasses(repository, output, 0, uncheckedElem, moduleRelevance, completedClasses); } }