Skip to content

Commit ca47d8c

Browse files
committed
Fix generative approach that was not working anymore for xmof
1 parent 6af7843 commit ca47d8c

File tree

1 file changed

+44
-10
lines changed

1 file changed

+44
-10
lines changed

trace/generator/plugins/fr.inria.diverse.trace.plugin.generator/src/fr/inria/diverse/trace/plugin/generator/clean/StandaloneEMFProjectGenerator.xtend

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public class StandaloneEMFProjectGenerator extends AbstractEMFProjectGenerator {
9797

9898
ecoreModelResource.unload
9999
ecoreModelResource.load(null)
100-
100+
101101
// Check that all required ecore models are available
102102
checkReferencedPackages(ecoreModelResource);
103103

@@ -190,14 +190,34 @@ public class StandaloneEMFProjectGenerator extends AbstractEMFProjectGenerator {
190190
genModel.initialize(Collections.singleton(rootEPackage));
191191
setMissingParameterTypes(genModel);
192192

193-
val List<GenPackage> missingGenPackages = computeMissingGenPackages(genModel);
194-
referencedGenPackages.addAll(missingGenPackages)
195-
referencedGenPackages.addAll(genModel.genPackages)
196-
genModel.getUsedGenPackages().addAll(missingGenPackages);
193+
fixUsedGenPackages(genModel)
197194

198195
return genModelResource;
199196
}
200197

198+
private Set<GenModel> fixedGenModels = new HashSet
199+
200+
/**
201+
* Tries to fix the "usedGenPackages" collection of a genmodel (and recursively of all genmodels it references)
202+
* 1) remove all usedGenPackages that have a null genModel (for a mysterious reason...)
203+
* 2) use the magical method 'computeMissingGenPackages' to find missing packages, and add them to usedGenPackages
204+
* 3) as a bonus, store all referenced gen packages in 'referencedGenPackages' for later use
205+
*/
206+
private def void fixUsedGenPackages(GenModel genModel) {
207+
if (!fixedGenModels.contains(genModel)) {
208+
fixedGenModels.add(genModel)
209+
genModel.usedGenPackages.removeAll(genModel.usedGenPackages.immutableCopy.filter[p|p.genModel == null])
210+
val List<GenPackage> missingGenPackages = computeMissingGenPackages(genModel);
211+
for (genPackage : missingGenPackages) {
212+
fixUsedGenPackages(genPackage.genModel)
213+
}
214+
referencedGenPackages.addAll(missingGenPackages)
215+
referencedGenPackages.addAll(genModel.genPackages)
216+
genModel.getUsedGenPackages().addAll(missingGenPackages);
217+
}
218+
219+
}
220+
201221
protected def String getModelName(URI genModelURI) {
202222
val String genModelFileName = genModelURI.trimFileExtension().lastSegment();
203223
val String modelName = genModelFileName.substring(0, 1).toUpperCase() + genModelFileName.substring(1);
@@ -323,7 +343,7 @@ public class StandaloneEMFProjectGenerator extends AbstractEMFProjectGenerator {
323343
- «e»
324344
«ENDFOR»
325345
«FOR e : errors BEFORE "Encountered diagnostic errors:\n" SEPARATOR "\n" AFTER "\n
326-
- «e.message»
346+
- «e.message» «««»» (source: «e.source»)
327347
«ENDFOR»
328348
'''
329349
}
@@ -335,13 +355,27 @@ public class StandaloneEMFProjectGenerator extends AbstractEMFProjectGenerator {
335355
val boolean canGenerate = generator.canGenerate(genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE);
336356
var String message = '''Cannot generate code of EPackage «this.ecoreModel.name»'''
337357
if (canGenerate) {
338-
val Diagnostic diagnostic = generator.generate(genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE,
339-
BasicMonitor.toMonitor(progressMonitor));
340-
if (diagnostic.getSeverity() == Diagnostic.OK) {
358+
359+
var Diagnostic diagnostic = null
360+
var String otherMessage = ""
361+
try {
362+
// Calling the generator
363+
diagnostic = generator.generate(genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE,
364+
BasicMonitor.toMonitor(progressMonitor));
365+
} catch (Throwable t) {
366+
otherMessage = exceptionToStackString(t)
367+
}
368+
369+
if (diagnostic != null && diagnostic.getSeverity() == Diagnostic.OK) {
341370
success = true;
342371
} else {
343-
message += ''': «diagnosticErrorsToString(diagnostic)».'''
372+
if (diagnostic != null)
373+
message += ''': «diagnosticErrorsToString(diagnostic)».'''
374+
else {
375+
message += otherMessage
376+
}
344377
}
378+
345379
} else {
346380
message += "generator.canGenerate returns false."
347381
}

0 commit comments

Comments
 (0)