Jelajahi Sumber

adapt Swift frontend to refined language API

Jan Wittler 4 tahun lalu
induk
melakukan
442bede970

+ 4 - 7
languages/swift/src/main/java/de/jplag/swift/Language.java

@@ -2,9 +2,11 @@ package de.jplag.swift;
 
 import java.io.File;
 import java.util.List;
+import java.util.Set;
 
 import org.kohsuke.MetaInfServices;
 
+import de.jplag.ParsingException;
 import de.jplag.Token;
 
 /**
@@ -44,12 +46,7 @@ public class Language implements de.jplag.Language {
     }
 
     @Override
-    public List<Token> parse(File directory, String[] files) {
-        return parserAdapter.parse(directory, files);
-    }
-
-    @Override
-    public boolean hasErrors() {
-        return parserAdapter.hasErrors();
+    public List<Token> parse(Set<File> files) throws ParsingException {
+        return parserAdapter.parse(files);
     }
 }

+ 11 - 15
languages/swift/src/main/java/de/jplag/swift/SwiftParserAdapter.java

@@ -5,6 +5,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
@@ -13,6 +14,7 @@ import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
 
 import de.jplag.AbstractParser;
+import de.jplag.ParsingException;
 import de.jplag.Token;
 import de.jplag.swift.grammar.Swift5Lexer;
 import de.jplag.swift.grammar.Swift5Parser;
@@ -20,7 +22,7 @@ import de.jplag.swift.grammar.Swift5Parser;
 public class SwiftParserAdapter extends AbstractParser {
 
     public static final int NOT_SET = -1;
-    private String currentFile;
+    private File currentFile;
     private List<Token> tokens;
 
     /**
@@ -31,26 +33,22 @@ public class SwiftParserAdapter extends AbstractParser {
     }
 
     /**
-     * Parsers a list of files into a single list of {@link Token}s.
-     * @param directory the directory of the files.
-     * @param fileNames the file names of the files.
+     * Parsers a set of files into a single list of {@link Token}s.
+     * @param files the set of files.
      * @return a list containing all tokens of all files.
      */
-    public List<Token> parse(File directory, String[] fileNames) {
+    public List<Token> parse(Set<File> files) throws ParsingException {
         tokens = new ArrayList<>();
-        for (String file : fileNames) {
-            if (!parseFile(directory, file)) {
-                errors++;
-            }
+        for (File file : files) {
+            parse(file);
             tokens.add(Token.fileEnd(file));
         }
         return tokens;
     }
 
-    private boolean parseFile(File directory, String fileName) {
-        File file = new File(directory, fileName);
+    private void parse(File file) throws ParsingException {
         try (FileInputStream inputStream = new FileInputStream(file)) {
-            currentFile = fileName;
+            currentFile = file;
 
             Swift5Lexer lexer = new Swift5Lexer(CharStreams.fromStream(inputStream));
             CommonTokenStream tokenStream = new CommonTokenStream(lexer);
@@ -65,10 +63,8 @@ public class SwiftParserAdapter extends AbstractParser {
                 treeWalker.walk(listener, parseTree);
             }
         } catch (IOException exception) {
-            logger.error("Parsing Error in '%s': %s%s".formatted(fileName, File.separator, exception));
-            return false;
+            throw new ParsingException(file, exception.getMessage(), exception);
         }
-        return true;
     }
 
     /**

+ 4 - 2
languages/swift/src/test/java/de/jplag/swift/SwiftFrontendTest.java

@@ -11,6 +11,7 @@ import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -19,6 +20,7 @@ import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import de.jplag.ParsingException;
 import de.jplag.SharedTokenType;
 import de.jplag.Token;
 import de.jplag.TokenPrinter;
@@ -61,9 +63,9 @@ class SwiftFrontendTest {
     }
 
     @Test
-    void parseTestFiles() {
+    void parseTestFiles() throws ParsingException {
         for (String fileName : testFiles) {
-            List<Token> tokens = language.parse(testFileLocation, new String[] {fileName});
+            List<Token> tokens = language.parse(Set.of(new File(testFileLocation, fileName)));
             String output = TokenPrinter.printTokens(tokens, testFileLocation, Optional.empty());
             logger.info(output);