Просмотр исходного кода

Add option to order containments before visiting.

Timur Sağlam 4 лет назад
Родитель
Сommit
17cddf4575

+ 1 - 0
jplag.frontend.emf-metamodel-dynamic/src/main/java/de/jplag/emf/dynamic/parser/DynamicMetamodelTokenGenerator.java

@@ -17,6 +17,7 @@ public class DynamicMetamodelTokenGenerator extends AbstractMetamodelVisitor {
      * @param parser is the parser which receives the generated tokens.
      */
     public DynamicMetamodelTokenGenerator(DynamicEcoreParser parser) {
+        super(false);
         this.parser = parser;
     }
 

+ 20 - 1
jplag.frontend.emf-metamodel/src/main/java/de/jplag/emf/parser/AbstractMetamodelVisitor.java

@@ -1,5 +1,6 @@
 package de.jplag.emf.parser;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EAnnotation;
@@ -11,6 +12,7 @@ import org.eclipse.emf.ecore.EEnum;
 import org.eclipse.emf.ecore.EEnumLiteral;
 import org.eclipse.emf.ecore.EFactory;
 import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.ENamedElement;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EOperation;
 import org.eclipse.emf.ecore.EPackage;
@@ -25,6 +27,12 @@ import org.eclipse.emf.ecore.ETypeParameter;
  */
 public abstract class AbstractMetamodelVisitor {
 
+    private final boolean sortContainmentsByType;
+
+    protected AbstractMetamodelVisitor(boolean sortContainmentsByType) {
+        this.sortContainmentsByType = sortContainmentsByType;
+    }
+
     private int currentTreeDepth;
 
     /**
@@ -86,14 +94,25 @@ public abstract class AbstractMetamodelVisitor {
         if (eObject instanceof ETypeParameter eTypeParameter) {
             visitETypeParameter(eTypeParameter);
         }
+        if (eObject instanceof ENamedElement eNamedElement) {
+            visitENamedElement(eNamedElement);
+        }
+
+        var children = new ArrayList<>(eObject.eContents());
+        if (sortContainmentsByType) {
+            children.sort((first, second) -> first.eClass().getName().compareTo(second.eClass().getName()));
+        }
 
         currentTreeDepth++;
-        for (EObject child : eObject.eContents()) {
+        for (EObject child : children) {
             visit(child);
         }
         currentTreeDepth--;
     }
 
+    protected void visitENamedElement(ENamedElement eNamedElement) {
+    }
+
     /**
      * Visit method that gets called for all annotation nodes.
      * @param eAnnotation is the node that is visited.

+ 1 - 0
jplag.frontend.emf-metamodel/src/main/java/de/jplag/emf/parser/MetamodelTokenGenerator.java

@@ -44,6 +44,7 @@ public class MetamodelTokenGenerator extends AbstractMetamodelVisitor {
      * @param parser is the parser which receives the generated tokens.
      */
     public MetamodelTokenGenerator(EcoreParser parser) {
+        super(true);
         this.parser = parser;
     }