From bb8b3e4dec6367da0bac7e1d0ee4cc4aae3bc208 Mon Sep 17 00:00:00 2001 From: Arkerthan <arkerthan@gmail.com> Date: Wed, 13 Mar 2019 11:32:45 +0100 Subject: [PATCH] updated jar and sources --- SanityCheck.jar | Bin 20708 -> 20729 bytes devTools/javaSanityCheck/src/Main.java | 92 +++++++++--------- devTools/javaSanityCheck/src/SyntaxError.java | 26 ++++- .../src/element/AngleBracketElement.java | 14 +-- .../src/element/CommentElement.java | 6 +- .../javaSanityCheck/src/element/Element.java | 9 +- .../src/element/KnownElement.java | 4 + .../src/element/KnownHtmlElement.java | 6 ++ .../src/element/KnownTwineElement.java | 7 ++ 9 files changed, 107 insertions(+), 57 deletions(-) diff --git a/SanityCheck.jar b/SanityCheck.jar index bebdf1da3e6277f966e8fff78ea96d884fe27b0b..36c886155cf61858bb6e54466cb88efc05f615cd 100644 GIT binary patch delta 13129 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 Zs;J69$jkjbb&w+j&8VWmEXx1O`G19Fn(Y7p delta 13088 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 KV0z^KmHB^g?bQDO diff --git a/devTools/javaSanityCheck/src/Main.java b/devTools/javaSanityCheck/src/Main.java index eea3a4ff611..87b18682d23 100644 --- a/devTools/javaSanityCheck/src/Main.java +++ b/devTools/javaSanityCheck/src/Main.java @@ -12,6 +12,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +/** + * @author Arkerthan + */ public class Main { public static TagSearchTree<Tag> htmlTags, twineTags; @@ -22,6 +25,7 @@ public class Main { private static String[] excluded; public static void main(String[] args) { + //setup setupExclude(); setupHtmlTags(); @@ -31,7 +35,7 @@ public class Main { //actual sanityCheck runSanityCheckInDirectory(workingDir, new File("src/")); - //handle errors + //output errors for (SyntaxError e : errors) { System.out.println(e.getError()); @@ -41,7 +45,7 @@ public class Main { /** * Goes through the whole directory including subdirectories and runs - * sanityCheck() on all .tw files + * {@link Main#sanityCheck(Path)} on all .tw files * * @param dir to be checked */ @@ -61,7 +65,7 @@ public class Main { } } catch (NullPointerException e) { e.printStackTrace(); - System.err.println("Couldn't find directory " + currentFile); + System.err.println("Couldn't read directory " + currentFile); System.exit(-1); } } @@ -78,42 +82,33 @@ public class Main { Charset encoding = Charset.defaultCharset(); if (!excluded(file.getPath())) { - try { - currentFile = file.getPath(); - currentLine = 1; - stack = new Stack<>(); - - //actually opening and reading the file - try (InputStream in = new FileInputStream(file); - Reader reader = new InputStreamReader(in, encoding); - // buffer for efficiency - Reader buffer = new BufferedReader(reader)) { - handleCharacters(buffer); - } + currentFile = file.getPath(); + currentLine = 1; + stack = new Stack<>(); + + //actually opening and reading the file + try (InputStream in = new FileInputStream(file); + Reader reader = new InputStreamReader(in, encoding); + // buffer for efficiency + Reader buffer = new BufferedReader(reader)) { + handleCharacters(buffer); } catch (IOException e) { + e.printStackTrace(); System.err.println("Couldn't read " + file); } } } /** - * sets up the alphabetical search tree for fast access of HTML tags later + * sets up a {@link TagSearchTree<Tag>} for fast access of HTML tags later */ private static void setupHtmlTags() { //load HTML tags into a list - List<Tag> TagsList = new LinkedList<>(); - try { - - Files.lines(new File("devTools/javaSanityCheck/htmlTags").toPath()).map(String::trim) - .filter(s -> !s.startsWith("#")) - .forEach(s -> TagsList.add(parseTag(s))); - } catch (IOException e) { - System.err.println("Couldn't read devTools/javaSanityCheck/htmlTags"); - } + List<Tag> TagsList = loadTags("devTools/javaSanityCheck/htmlTags"); //turn List into alphabetical search tree try { - htmlTags = new TagSearchTree(TagsList); + htmlTags = new TagSearchTree<>(TagsList); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Illegal Character in devTools/javaSanityCheck/htmlTags"); System.exit(-1); @@ -121,29 +116,39 @@ public class Main { } /** - * sets up the alphabetical search tree for fast access of twine tags later + * sets up a {@link TagSearchTree<Tag>} for fast access of twine tags later */ private static void setupTwineTags() { //load twine tags into a list - List<Tag> TagsList = new LinkedList<>(); - try { - - Files.lines(new File("devTools/javaSanityCheck/twineTags").toPath()).map(String::trim) - .filter(s -> !s.startsWith("#")) - .forEach(s -> TagsList.add(parseTag(s))); - } catch (IOException e) { - System.err.println("Couldn't read devTools/javaSanityCheck/twineTags"); - } + List tagsList = loadTags("devTools/javaSanityCheck/twineTags"); //turn List into alphabetical search tree try { - twineTags = new TagSearchTree(TagsList); + twineTags = new TagSearchTree<>(tagsList); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Illegal Character in devTools/javaSanityCheck/twineTags"); System.exit(-1); } } + /** + * Loads a list of tags from a file + * + * @param filePath file to load tags from + * @return loaded tags + */ + private static List<Tag> loadTags(String filePath) { + List<Tag> tagsList = new LinkedList<>(); + try { + Files.lines(new File(filePath).toPath()).map(String::trim) + .filter(s -> !s.startsWith("#")) + .forEach(s -> tagsList.add(parseTag(s))); + } catch (IOException e) { + System.err.println("Couldn't read " + filePath); + } + return tagsList; + } + /** * Turns a string into a Tag * ";1" at the end of the String indicates that the tag needs to be closed later @@ -160,7 +165,7 @@ public class Main { } /** - * sets up the excluded array. + * sets up the excluded files array. */ private static void setupExclude() { //load excluded files @@ -173,7 +178,7 @@ public class Main { System.err.println("Couldn't read devTools/javaSanityCheck/excluded"); } - //turn excluded files into an array and change them to windows style if needed + //turn excluded files into an array and change path to windows style if needed if (isWindows()) { excluded = new String[excludedList.size()]; int i = 0; @@ -252,15 +257,13 @@ public class Main { stack.pop(); return; } - //3 means the Element is complete and part of a two tag system + //3 means the Element is complete and part of a two or more tag system if (change == 3) { //remove the topmost element from stack since it is complete KnownElement k = stack.pop().getKnownElement(); - /*if (k.isOpening()) { - stack.push(k); - } else */ + //if KnownElement k is closing another tag check if there is one and remove it if (k.isClosing()) { - if (stack.empty()) { + if (stack.empty()) { //there are no open tags at all addError(new SyntaxError("Closed tag " + k.getShortDescription() + " without having any open tags.", -2)); } else if (stack.peek() instanceof KnownElement) { KnownElement kFirst = (KnownElement) stack.pop(); @@ -268,7 +271,6 @@ public class Main { addError(new SyntaxError("Opening tag " + kFirst.getShortDescription() + " does not match closing tag " + k.getShortDescription() + ".", -2)); } - //stack.pop(); } else { addError(new SyntaxError("Closing tag " + k.getShortDescription() + " inside " + "another tag: " + stack.peek().getShortDescription(), -2, true)); diff --git a/devTools/javaSanityCheck/src/SyntaxError.java b/devTools/javaSanityCheck/src/SyntaxError.java index 150f2bd449b..ad7aa7cdf3c 100644 --- a/devTools/javaSanityCheck/src/SyntaxError.java +++ b/devTools/javaSanityCheck/src/SyntaxError.java @@ -7,33 +7,57 @@ public class SyntaxError extends Exception { private int change; //see Element for values; -2 means not thrown private boolean warning = false; + /** + * @param description description of error + * @param change state change as specified in Element + */ public SyntaxError(String description, int change) { this.description = description; this.change = change; } + /** + * @param description description of error + * @param change state change as specified in Element + * @param warning whether it is a warning or an error + */ public SyntaxError(String description, int change, boolean warning) { this(description, change); this.warning = warning; } + /** + * @param file at which the error occurred + */ public void setFile(String file) { this.file = file; } + /** + * @param line in which the error occurred + */ public void setLine(int line) { this.line = line; } + /** + * @param position at which the error occurred + */ public void setPosition(int position) { this.position = position; } + /** + * @return error message + */ public String getError() { String s = warning ? "Warning: " : "Error: "; - return s + file + ": " + line + ":" + position + " : "+ description; + return s + file + ": " + line + ":" + position + " : " + description; } + /** + * @return change that happened in Element before it was thrown. -1 if not thrown. + */ public int getChange() { return change; } diff --git a/devTools/javaSanityCheck/src/element/AngleBracketElement.java b/devTools/javaSanityCheck/src/element/AngleBracketElement.java index e4819ba37ea..233c4f30320 100644 --- a/devTools/javaSanityCheck/src/element/AngleBracketElement.java +++ b/devTools/javaSanityCheck/src/element/AngleBracketElement.java @@ -64,7 +64,7 @@ public class AngleBracketElement extends Element { return handleOpeningHTML(c); } catch (SyntaxError e) { state = 1; - throw new SyntaxError("Opening \"<\" missing, found " + c + " [debug:initialCase]", 1); + throw new SyntaxError("Opening \"<\" missing, found " + c, 1); } } case 1: @@ -105,7 +105,7 @@ public class AngleBracketElement extends Element { state = 3; return 1; } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 2); } case 4: if (c == '>') { @@ -120,20 +120,20 @@ public class AngleBracketElement extends Element { state = 4; return 1; } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); + throw new SyntaxError("Closing \">\" missing, opened tag at[" + line + ":" + pos + "]", 2); } case 5: if (c == '>') { state = -5; return 1; } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 2); } case -5: if (c == '>') { return 2; } - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 2); + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 2); case 6: if (c == '>') { return 3; @@ -141,13 +141,13 @@ public class AngleBracketElement extends Element { state = 3; return 1; } else { - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 3); + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 3); } case -6: if (c == '>') { return 3; } - throw new SyntaxError("Closing \">\" missing, opened [" + line + ":" + pos + "]", 3); + throw new SyntaxError("Closing \">\" missing, opened tag at [" + line + ":" + pos + "]", 3); case -9: if (c == '>') { diff --git a/devTools/javaSanityCheck/src/element/CommentElement.java b/devTools/javaSanityCheck/src/element/CommentElement.java index 3a3cc12aff9..159b92afcd5 100644 --- a/devTools/javaSanityCheck/src/element/CommentElement.java +++ b/devTools/javaSanityCheck/src/element/CommentElement.java @@ -4,7 +4,7 @@ import org.arkerthan.sanityCheck.SyntaxError; import org.arkerthan.sanityCheck.UnknownStateException; public class CommentElement extends Element { - int state = 0; + private int state = 0; /* 0 - / 1 - /*??? @@ -13,6 +13,10 @@ public class CommentElement extends Element { 4 - /%???% */ + /** + * @param line line in which comment starts + * @param pos position in line where comment starts + */ public CommentElement(int line, int pos) { super(line, pos); } diff --git a/devTools/javaSanityCheck/src/element/Element.java b/devTools/javaSanityCheck/src/element/Element.java index b0f99fa904f..96f71976f3d 100644 --- a/devTools/javaSanityCheck/src/element/Element.java +++ b/devTools/javaSanityCheck/src/element/Element.java @@ -23,12 +23,15 @@ public abstract class Element { * 3 - the Element is finished and a KnownHtmlElement was generated * 4 - the Element is finished and the char is still open for use * - * @param c - * @return - * @throws Error + * @param c char to be parsed + * @return state change + * @throws SyntaxError thrown when an syntax error is detected */ public abstract int handleChar(char c) throws SyntaxError; + /** + * @return the constructed KnownElement. null if none was constructed yet. + */ public KnownElement getKnownElement() { return k; } diff --git a/devTools/javaSanityCheck/src/element/KnownElement.java b/devTools/javaSanityCheck/src/element/KnownElement.java index 305be2fe652..7bc0b7a1ee7 100644 --- a/devTools/javaSanityCheck/src/element/KnownElement.java +++ b/devTools/javaSanityCheck/src/element/KnownElement.java @@ -4,6 +4,10 @@ import org.arkerthan.sanityCheck.SyntaxError; public abstract class KnownElement extends Element { + /** + * @param line at which it begins + * @param pos at which it begins + */ public KnownElement(int line, int pos) { super(line, pos); } diff --git a/devTools/javaSanityCheck/src/element/KnownHtmlElement.java b/devTools/javaSanityCheck/src/element/KnownHtmlElement.java index d086a74bc54..c262263b9b7 100644 --- a/devTools/javaSanityCheck/src/element/KnownHtmlElement.java +++ b/devTools/javaSanityCheck/src/element/KnownHtmlElement.java @@ -5,6 +5,12 @@ public class KnownHtmlElement extends KnownElement { private boolean opening; private String statement; + /** + * @param line at which it begins + * @param pos at which it begins + * @param opening if it opens a tag: <tag> or closes it: </tag> + * @param statement statement inside the tag + */ public KnownHtmlElement(int line, int pos, boolean opening, String statement) { super(line, pos); this.opening = opening; diff --git a/devTools/javaSanityCheck/src/element/KnownTwineElement.java b/devTools/javaSanityCheck/src/element/KnownTwineElement.java index 24003fd00be..765d9b682ee 100644 --- a/devTools/javaSanityCheck/src/element/KnownTwineElement.java +++ b/devTools/javaSanityCheck/src/element/KnownTwineElement.java @@ -5,6 +5,13 @@ public class KnownTwineElement extends KnownElement { private boolean opening; private String statement; + /** + * + * @param line at which it begins + * @param pos at which it begins + * @param opening if it opens a tag: <<tag>> or closes it: <</tag>> + * @param statement statement inside the tag + */ public KnownTwineElement(int line, int pos, boolean opening, String statement) { super(line, pos); this.opening = opening; -- GitLab