diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-03-28 20:00:08 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-03-28 20:00:08 +0100 |
| commit | 65df0c14fab30a168de488ec23647cd4b69fb3c4 (patch) | |
| tree | 687c3a13685c678d8ed2f92986267da2c39217d3 /src/main | |
| parent | 179e2be404cb80bd6d1b9c331d469b80359dfb8d (diff) | |
Store character index in exception
Diffstat (limited to 'src/main')
4 files changed, 23 insertions, 15 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java index 56a10da..db0b1bb 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java @@ -7,6 +7,8 @@ import java.math.BigInteger; import java.util.Optional; import java.util.function.BiConsumer; +import static org.zwobble.mammoth.internal.styles.parsing.LineParseException.lineParseException; + public class DocumentMatcherParser { public static BiConsumer<StyleMapBuilder, HtmlPath> parse(TokenIterator<TokenType> tokens) { Token<TokenType> identifier = tokens.next(TokenType.IDENTIFIER); @@ -31,7 +33,7 @@ public class DocumentMatcherParser { BreakMatcher breakMatcher = parseBreakMatcher(tokens); return (builder, path) -> builder.mapBreak(breakMatcher, path); default: - throw new LineParseException(identifier, "Unrecognised document element: " + identifier); + throw lineParseException(identifier, "Unrecognised document element: " + identifier); } } @@ -69,7 +71,7 @@ public class DocumentMatcherParser { } else if (tokens.trySkip(TokenType.SYMBOL, "^=")) { return new StartsWithStringMatcher(TokenParser.parseString(tokens)); } else { - throw new LineParseException(tokens.next(), "Expected string matcher but got token " + tokens.next().getValue()); + throw lineParseException(tokens.next(), "Expected string matcher but got token " + tokens.next().getValue()); } } @@ -93,7 +95,7 @@ public class DocumentMatcherParser { case "unordered-list": return false; default: - throw new LineParseException(listType, "Unrecognised list type: " + listType); + throw lineParseException(listType, "Unrecognised list type: " + listType); } } @@ -112,7 +114,7 @@ public class DocumentMatcherParser { case "column": return BreakMatcher.COLUMN_BREAK; default: - throw new LineParseException(stringToken, "Unrecognised break type: " + typeName); + throw lineParseException(stringToken, "Unrecognised break type: " + typeName); } } } diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/LineParseException.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/LineParseException.java index 944e7f1..29d3668 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/LineParseException.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/LineParseException.java @@ -1,14 +1,18 @@ package org.zwobble.mammoth.internal.styles.parsing; class LineParseException extends RuntimeException { - private final Token token; + static <T> LineParseException lineParseException(Token<T> token, String message) { + return new LineParseException(token.getCharacterIndex(), message); + } + + private final int characterIndex; - LineParseException(Token token, String message) { + private LineParseException(int characterIndex, String message) { super(message); - this.token = token; + this.characterIndex = characterIndex; } - public Token getToken() { - return token; + int getCharacterIndex() { + return characterIndex; } } diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java index 002a5aa..bb8c0cc 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java @@ -22,7 +22,7 @@ public class StyleMapParser { try { handleLine(styleMap, line); } catch (LineParseException exception) { - throw new ParseException(generateErrorMessage(line, lineIndex + 1, exception.getToken(), exception.getMessage())); + throw new ParseException(generateErrorMessage(line, lineIndex + 1, exception.getCharacterIndex(), exception.getMessage())); } } return styleMap.build(); @@ -64,11 +64,11 @@ public class StyleMapParser { } } - private static String generateErrorMessage(String line, int lineNumber, Token token, String message) { - return "error reading style map at line " + lineNumber + ", character " + (token.getCharacterIndex() + 1) + + private static String generateErrorMessage(String line, int lineNumber, int characterIndex, String message) { + return "error reading style map at line " + lineNumber + ", character " + (characterIndex + 1) + ": " + message + "\n\n" + line + "\n" + - repeatString(" ", token.getCharacterIndex()) + "^"; + repeatString(" ", characterIndex) + "^"; } private static String repeatString(String value, int times) { diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java index 3507455..5d81c7e 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java @@ -2,6 +2,8 @@ package org.zwobble.mammoth.internal.styles.parsing; import java.util.List; +import static org.zwobble.mammoth.internal.styles.parsing.LineParseException.lineParseException; + public class TokenIterator<T> { private final List<Token<T>> tokens; private int index; @@ -77,13 +79,13 @@ public class TokenIterator<T> { } String actualValue = token.getValue(); if (!actualValue.equals(tokenValue)) { - throw new LineParseException(token, "expected " + tokenType + " token with value " + tokenValue + " but value was " + actualValue); + throw lineParseException(token, "expected " + tokenType + " token with value " + tokenValue + " but value was " + actualValue); } index += 1; } private LineParseException unexpectedTokenType(T expected, Token<T> actual) { - return new LineParseException(actual, "expected token of type " + expected + " but was of type " + actual.getTokenType()); + return lineParseException(actual, "expected token of type " + expected + " but was of type " + actual.getTokenType()); } public boolean tryParse(Action action) { |
