Skip to content

Commit 8aa122c

Browse files
authored
Add option to save NMeta metamodel (#124)
2 parents 9572d6b + 22b972d commit 8aa122c

2 files changed

Lines changed: 28 additions & 13 deletions

File tree

‎Tools/Ecore2Code.history‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ component NMF-Basics.nuspec
99
patch (2.0.458): Start using EtiCat
1010
patch: Add support for .NET 10
1111
patch: Print loading errors to stderr
12+
patch: Add option to save NMeta metamodel

‎Tools/Ecore2Code/Program.cs‎

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public Options()
6767
[Option('m', "metamodel", Required = false, HelpText = "Specify this argument if you want to serialize the NMeta metamodel possibly generated from Ecore")]
6868
public string NMeta { get; set; }
6969

70+
[Option("save-nmeta", Required = false, HelpText = "If set, Ecore2Code will save any metamodel consumed in a different format that NMeta as an NMeta file in the same directory.")]
71+
public bool SaveNMeta { get; set; }
72+
7073
[Option('r', "resolve", Required = false, HelpText = "A list of namespace remappings with optional code base namespace override in the syntax URI@baseNamespace=file, multiple entries separated by ';'", Separator = ';')]
7174
public IEnumerable<string> NamespaceMappings { get; set; }
7275

@@ -358,30 +361,32 @@ public INamespace LoadPackageFromFiles(IDictionary<Uri, string> resolveMappings)
358361
{
359362
case EPackage ecorePackage:
360363
#if DEBUG
361-
packages.Add(EcoreInterop.Transform2Meta(ecorePackage, AddMissingPackage));
364+
var ns = EcoreInterop.Transform2Meta(ecorePackage, AddMissingPackage);
365+
AddNamespace(packages, ecoreFile, model, ns);
362366
#else
363-
try
364-
{
365-
packages.Add(EcoreInterop.Transform2Meta(ecorePackage, AddMissingPackage));
366-
}
367-
catch (Exception ex)
368-
{
369-
Console.WriteLine("An error occurred reading the Ecore file. The error message was: " + ex.Message);
370-
Environment.ExitCode = 1;
371-
}
367+
try
368+
{
369+
var ns = EcoreInterop.Transform2Meta(ecorePackage, AddMissingPackage);
370+
AddNamespace(packages, ecoreFile, model, ns);
371+
}
372+
catch (Exception ex)
373+
{
374+
Console.WriteLine("An error occurred reading the Ecore file. The error message was: " + ex.Message);
375+
Environment.ExitCode = 1;
376+
}
372377
#endif
373378
break;
374379
case Namespace nmetaNamespace:
375380
packages.Add(nmetaNamespace);
376381
break;
377382
case CmofPackage cmofPackage:
378-
packages.Add(UmlInterop.Transform(cmofPackage, AddMissingPackage));
383+
AddNamespace(packages, ecoreFile, model, UmlInterop.Transform(cmofPackage, AddMissingPackage));
379384
break;
380385
case UmlPackage umlPackage:
381-
packages.Add(UmlInterop.Transform(umlPackage, AddMissingPackage));
386+
AddNamespace(packages, ecoreFile, model, UmlInterop.Transform(umlPackage, AddMissingPackage));
382387
break;
383388
case LegacyCmofPackage legacyCmofPackage:
384-
packages.Add(UmlInterop.Transform(legacyCmofPackage, AddMissingPackage));
389+
AddNamespace(packages, ecoreFile, model, UmlInterop.Transform(legacyCmofPackage, AddMissingPackage));
385390
break;
386391
default:
387392
Console.Error.WriteLine($"{item} (resolved from {ecoreFile}) is not a supported metamodel.");
@@ -407,6 +412,15 @@ public INamespace LoadPackageFromFiles(IDictionary<Uri, string> resolveMappings)
407412
}
408413
}
409414

415+
private void AddNamespace(List<INamespace> packages, string ecoreFile, Model model, INamespace ns)
416+
{
417+
packages.Add(ns);
418+
if (options.SaveNMeta && model.RootElements.Count == 1)
419+
{
420+
repository.Save(ns, Path.ChangeExtension(ecoreFile, ".nmeta"));
421+
}
422+
}
423+
410424
private static void HandleStar(object sender, ConverterExceptionEventArgs e)
411425
{
412426
if (e.TextValue == "*" && e.Type.MappedType == typeof(int))

0 commit comments

Comments
 (0)