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

Improve tree view and clean up metamodel visitor.

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

+ 0 - 19
jplag.frontend.emf-metamodel/src/main/java/de/jplag/emf/parser/AbstractMetamodelVisitor.java

@@ -1,7 +1,6 @@
 package de.jplag.emf.parser;
 
 import java.util.ArrayList;
-import java.util.List;
 
 import org.eclipse.emf.ecore.EAnnotation;
 import org.eclipse.emf.ecore.EAttribute;
@@ -166,22 +165,4 @@ public abstract class AbstractMetamodelVisitor {
     protected void visitETypeParameter(ETypeParameter eTypeParameter) {
     }
 
-    /**
-     * TODO TS: Remove generator method.
-     */
-    public static void main(String[] args) {
-        List<String> types = List.of("EPackage", "EAnnotation", "EClassifier", "EClass", "EDataType", "EStructuralFeature", "EAttribute",
-                "EReference", "EOperation", "EEnum", "EEnumLiteral", "EParameter", "EGenericType", "ETypeParameter");
-
-        for (String type : types) {
-            System.out.println("if (eObject instanceof " + type + " e" + type.substring(1) + ") {");
-            System.out.println("    visit" + type + "(e" + type.substring(1) + ");");
-            System.out.println("}");
-        }
-
-        for (String type : types) {
-            System.out.println("protected void visit" + type + "(" + type + " e" + type.substring(1) + ") {}");
-        }
-    }
-
 }

+ 6 - 2
jplag.frontend.emf-metamodel/src/main/java/de/jplag/emf/parser/EcoreParser.java

@@ -73,9 +73,13 @@ public class EcoreParser extends AbstractParser {
         return new MetamodelTokenGenerator(this);
     }
 
-    public void addToken(int type, EObject source) {
+    public void addToken(int type, EObject source, String prefix) {
         MetamodelToken token = new MetamodelToken(type, currentFile + Language.VIEW_FILE_SUFFIX, source);
-        treeView.addToken(token, visitor.getCurrentTreeDepth());
+        treeView.addToken(token, visitor.getCurrentTreeDepth(), prefix);
         tokens.addToken(token);
     }
+
+    public void addToken(int type, EObject source) {
+        addToken(type, source, "");
+    }
 }

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

@@ -71,7 +71,7 @@ public class MetamodelTokenGenerator extends AbstractMetamodelVisitor {
         } else {
             parser.addToken(CLASS, eClass);
         }
-        eClass.getESuperTypes().forEach(it -> parser.addToken(SUPER_TYPE, it));
+        eClass.getESuperTypes().forEach(it -> parser.addToken(SUPER_TYPE, it, " extends "));
     }
 
     @Override
@@ -98,7 +98,6 @@ public class MetamodelTokenGenerator extends AbstractMetamodelVisitor {
             parser.addToken(RETURN_TYPE, eOperation);
         }
         eOperation.getEExceptions().forEach(it -> parser.addToken(THROWS_DECLARATION, it));
-        // TODO TS: Parse generic type?
     }
 
     @Override

+ 20 - 18
jplag.frontend.emf-metamodel/src/main/java/de/jplag/emf/parser/MetamodelTreeView.java

@@ -4,24 +4,24 @@ import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 
 import org.eclipse.emf.ecore.ENamedElement;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import de.jplag.emf.MetamodelToken;
 
 /**
- * Simplcisitc tree view representation of an EMF metamodel.
+ * Simplistic tree view representation of an EMF metamodel.
  * @author Timur Saglam
  */
 public class MetamodelTreeView {
     private final String filePath;
-    private final List<MetamodelToken> tokens;
     private int lineIndex;
     private int columnIndex;
     private final StringBuilder viewBuilder;
     private final static String INDENTATION = "  ";
+    public final Logger logger;
 
     /**
      * Creates a tree view for a metamodel.
@@ -29,7 +29,7 @@ public class MetamodelTreeView {
      */
     public MetamodelTreeView(String filePath) {
         this.filePath = filePath;
-        tokens = new ArrayList<>();
+        logger = LoggerFactory.getLogger(this.getClass());
         viewBuilder = new StringBuilder();
     }
 
@@ -38,9 +38,13 @@ public class MetamodelTreeView {
      * @param token is the token to add.
      * @param treeDepth is the current containment tree depth, required for the indentation.
      */
-    public void addToken(MetamodelToken token, int treeDepth) {
+    public void addToken(MetamodelToken token, int treeDepth, String prefix) {
         token.getEObject().ifPresent(it -> {
-            tokens.add(token);
+            if (prefix.isEmpty() && treeDepth > 0) {
+                lineIndex++;
+                columnIndex = 0;
+                viewBuilder.append(System.lineSeparator());
+            }
 
             String tokenText = token.toString();
             if (it instanceof ENamedElement element) {
@@ -48,26 +52,24 @@ public class MetamodelTreeView {
             }
             token.setLength(tokenText.length());
 
-            String prefix = ""; // TS TODO implement prefix for non new lines
             if (prefix.isEmpty()) {
+                String indentedText = tokenText;
                 for (int i = 0; i < treeDepth; i++) {
-                    tokenText = INDENTATION + tokenText;
+                    indentedText = INDENTATION + indentedText;
                     columnIndex += INDENTATION.length();
                 }
+                viewBuilder.append(indentedText);
             } else {
-                tokenText = prefix + tokenText;
+                viewBuilder.append(prefix + tokenText);
                 columnIndex += prefix.length();
             }
-            viewBuilder.append(tokenText);
 
             token.setLine(lineIndex + 1);
             token.setColumn(columnIndex + 1);
 
-            lineIndex++;
-            columnIndex = 0;
-            viewBuilder.append(System.lineSeparator());
-        });
+            columnIndex += tokenText.length();
 
+        });
     }
 
     /**
@@ -77,12 +79,12 @@ public class MetamodelTreeView {
     public void writeToFile(String suffix) {
         File treeViewFile = new File(filePath + suffix);
         try (BufferedWriter writer = new BufferedWriter(new FileWriter(treeViewFile));) {
-            if (!treeViewFile.exists()) {
-                treeViewFile.createNewFile();
+            if (!treeViewFile.createNewFile()) {
+                logger.warn("Overwriting tree view file: " + treeViewFile);
             }
             writer.append(viewBuilder.toString());
         } catch (IOException exception) {
-            exception.printStackTrace();
+            logger.error("Could not write tree view file!", exception);
         }
     }
 

+ 1 - 1
jplag.frontend.emf-model/src/test/java/de/jplag/emf/model/MinimalModelInstanceTest.java

@@ -47,7 +47,7 @@ class MinimalModelInstanceTest {
         assertNotEquals(0, result.size());
 
         List<String> treeViewFiles = Arrays.stream(testSubjects).map(it -> it + Language.VIEW_FILE_SUFFIX).collect(toList());
-        logger.info(TokenPrinter.printTokens(result, baseDirectory, treeViewFiles));
+        logger.debug(TokenPrinter.printTokens(result, baseDirectory, treeViewFiles));
         logger.info("Dynamic token set: " + DynamicMetamodelTokenConstants.getTokenStrings());
         logger.info("Parsed tokens: " + result.allTokens().toString());