From b5b0f17ac116c2dce1a540fec8525f1bbf47f7a2 Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Mon, 4 Mar 2013 09:50:17 -0500 Subject: [PATCH] Track newlines within triple quotes, fixes #61 --- .../main/java/com/typesafe/config/impl/Parser.java | 9 ++++++++- .../main/java/com/typesafe/config/impl/Tokenizer.java | 5 +++++ .../com/typesafe/config/impl/ConfParserTest.scala | 11 +++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/config/src/main/java/com/typesafe/config/impl/Parser.java b/config/src/main/java/com/typesafe/config/impl/Parser.java index 78a1b5c6..13331d35 100644 --- a/config/src/main/java/com/typesafe/config/impl/Parser.java +++ b/config/src/main/java/com/typesafe/config/impl/Parser.java @@ -200,12 +200,19 @@ final class Parser { while (Tokens.isNewline(t.token)) { // line number tokens have the line that was _ended_ by the - // newline, so we have to add one. + // newline, so we have to add one. We have to update lineNumber + // here and also below, because not all tokens store a line + // number, but newline tokens always do. lineNumber = t.token.lineNumber() + 1; t = nextToken(); } + // update line number again, iff we have one + int newNumber = t.token.lineNumber(); + if (newNumber >= 0) + lineNumber = newNumber; + return t; } diff --git a/config/src/main/java/com/typesafe/config/impl/Tokenizer.java b/config/src/main/java/com/typesafe/config/impl/Tokenizer.java index 441b9187..4332aa7b 100644 --- a/config/src/main/java/com/typesafe/config/impl/Tokenizer.java +++ b/config/src/main/java/com/typesafe/config/impl/Tokenizer.java @@ -435,6 +435,11 @@ final class Tokenizer { consecutiveQuotes = 0; if (c == -1) throw problem("End of input but triple-quoted string was still open"); + else if (c == '\n') { + // keep the line number accurate + lineNumber += 1; + lineOrigin = origin.setLineNumber(lineNumber); + } } sb.appendCodePoint(c); diff --git a/config/src/test/scala/com/typesafe/config/impl/ConfParserTest.scala b/config/src/test/scala/com/typesafe/config/impl/ConfParserTest.scala index f102881f..8c8c6f12 100644 --- a/config/src/test/scala/com/typesafe/config/impl/ConfParserTest.scala +++ b/config/src/test/scala/com/typesafe/config/impl/ConfParserTest.scala @@ -343,6 +343,17 @@ class ConfParserTest extends TestUtils { lineNumberTest(1, "1e\n") lineNumberTest(2, "\n1e\n") lineNumberTest(3, "\n\n1e\n") + + // newlines in triple-quoted string should not hose up the numbering + lineNumberTest(1, "a : \"\"\"foo\"\"\"}") + lineNumberTest(2, "a : \"\"\"foo\n\"\"\"}") + lineNumberTest(3, "a : \"\"\"foo\nbar\nbaz\"\"\"}") + // newlines after the triple quoted string + lineNumberTest(5, "a : \"\"\"foo\nbar\nbaz\"\"\"\n\n}") + // triple quoted string ends in a newline + lineNumberTest(6, "a : \"\"\"foo\nbar\nbaz\n\"\"\"\n\n}") + // end in the middle of triple-quoted string + lineNumberTest(5, "a : \"\"\"foo\n\n\nbar\n") } @Test