Skip to content

Commit b2377a1

Browse files
committed
Add support for multiline inline tables (#91)
1 parent b84c814 commit b2377a1

File tree

4 files changed

+108
-67
lines changed

4 files changed

+108
-67
lines changed

src/Tomlyn.Tests/BasicTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,22 @@ public void SimpleTest()
160160
var doc = Toml.Parse(test);
161161
Assert.AreEqual(test, doc.ToString());
162162
}
163+
164+
[Test]
165+
public void TestInlineArray()
166+
{
167+
var input = @"x = [1,
168+
2,
169+
3
170+
]
171+
";
172+
var model = Toml.ToModel(input);
173+
var array = model["x"] as TomlArray;
174+
Assert.NotNull(array);
175+
Assert.AreEqual(3, array.Count);
176+
Assert.AreEqual(1, array[0]);
177+
Assert.AreEqual(2, array[1]);
178+
Assert.AreEqual(3, array[2]);
179+
}
163180
}
164181
}

src/Tomlyn.Tests/SerializationTests.cs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,24 @@
66
using NUnit.Framework;
77
using Tomlyn.Model;
88

9-
namespace Tomlyn.Tests
9+
namespace Tomlyn.Tests;
10+
11+
public class SerializationTests
1012
{
11-
public class SerializationTests
13+
[Test]
14+
public void TestCrlfInMultilineString()
1215
{
13-
[Test]
14-
public void TestCrlfInMultilineString()
16+
var model = new TomlTable
17+
{
18+
PropertiesMetadata = new TomlPropertiesMetadata()
19+
};
20+
model.PropertiesMetadata.SetProperty("property", new TomlPropertyMetadata
1521
{
16-
var model = new TomlTable
17-
{
18-
PropertiesMetadata = new TomlPropertiesMetadata()
19-
};
20-
model.PropertiesMetadata.SetProperty("property", new TomlPropertyMetadata
21-
{
22-
DisplayKind = TomlPropertyDisplayKind.StringLiteralMulti
23-
});
22+
DisplayKind = TomlPropertyDisplayKind.StringLiteralMulti
23+
});
2424

25-
model["property"] = "string\r\nwith\r\nnewlines";
25+
model["property"] = "string\r\nwith\r\nnewlines";
2626

27-
Assert.AreEqual("property = '''string\r\nwith\r\nnewlines'''" + Environment.NewLine, Toml.FromModel(model));
28-
}
27+
Assert.AreEqual("property = '''string\r\nwith\r\nnewlines'''" + Environment.NewLine, Toml.FromModel(model));
2928
}
3029
}

src/Tomlyn.Tests/TomlTests.cs

Lines changed: 77 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,81 @@ public void TestDescendants()
3434
test.sub.key = ""yes""
3535
[[array]]
3636
hello = true
37-
".ReplaceLineEndings("\r\n");
37+
";
38+
var expected = """
39+
trivia: (1,1)-(1,19) Comment "# This is a comment"
40+
trivia: (1,20)-(1,21) NewLine "\r\n"
41+
token: (2,1)-(2,1) "["
42+
token: (2,2)-(2,6) "table"
43+
token: (2,7)-(2,7) "]"
44+
token: (2,8)-(2,9) "\r\n"
45+
token: (3,1)-(3,3) "key"
46+
trivia: (3,4)-(3,4) Whitespaces " "
47+
token: (3,5)-(3,5) "="
48+
trivia: (3,6)-(3,6) Whitespaces " "
49+
token: (3,7)-(3,7) "1"
50+
trivia: (3,8)-(3,8) Whitespaces " "
51+
trivia: (3,9)-(3,33) Comment "# This is another comment"
52+
token: (3,34)-(3,35) "\r\n"
53+
token: (4,1)-(4,4) "test"
54+
token: (4,5)-(4,5) "."
55+
token: (4,6)-(4,8) "sub"
56+
token: (4,9)-(4,9) "."
57+
token: (4,10)-(4,12) "key"
58+
trivia: (4,13)-(4,13) Whitespaces " "
59+
token: (4,14)-(4,14) "="
60+
trivia: (4,15)-(4,15) Whitespaces " "
61+
token: (4,16)-(4,20) "\"yes\""
62+
token: (4,21)-(4,22) "\r\n"
63+
token: (5,1)-(5,2) "[["
64+
token: (5,3)-(5,7) "array"
65+
token: (5,8)-(5,9) "]]"
66+
token: (5,10)-(5,11) "\r\n"
67+
token: (6,1)-(6,5) "hello"
68+
trivia: (6,6)-(6,6) Whitespaces " "
69+
token: (6,7)-(6,7) "="
70+
trivia: (6,8)-(6,8) Whitespaces " "
71+
token: (6,9)-(6,12) "true"
72+
token: (6,13)-(6,14) "\r\n"
73+
74+
""";
75+
AssertDocumentSyntax(expected, input);
76+
}
77+
78+
[Test]
79+
public void TestInlineArray()
80+
{
81+
var input = @"x = [1,
82+
2,
83+
3
84+
]
85+
";
86+
var expected = """
87+
token: (1,1)-(1,1) "x"
88+
trivia: (1,2)-(1,2) Whitespaces " "
89+
token: (1,3)-(1,3) "="
90+
trivia: (1,4)-(1,4) Whitespaces " "
91+
token: (1,5)-(1,5) "["
92+
token: (1,6)-(1,6) "1"
93+
token: (1,7)-(1,7) ","
94+
trivia: (1,8)-(1,9) NewLine "\r\n"
95+
token: (2,1)-(2,1) "2"
96+
token: (2,2)-(2,2) ","
97+
trivia: (2,3)-(2,4) NewLine "\r\n"
98+
token: (3,1)-(3,1) "3"
99+
trivia: (3,2)-(3,3) NewLine "\r\n"
100+
token: (4,1)-(4,1) "]"
101+
token: (4,2)-(4,3) "\r\n"
102+
103+
""";
104+
AssertDocumentSyntax(expected, input);
105+
}
38106

39-
var tokens = Toml.Parse(input).Tokens().ToList();
107+
private static void AssertDocumentSyntax(string expected, string input)
108+
{
109+
input = input.ReplaceLineEndings("\r\n");
110+
var doc = Toml.Parse(input);
111+
var tokens = doc.Tokens().ToList();
40112
var builder = new StringBuilder();
41113
foreach (var node in tokens)
42114
{
@@ -49,48 +121,8 @@ public void TestDescendants()
49121
builder.AppendLine($"token: {token.Span} {(token.Text is not null ? TomlFormatHelper.ToString(token.Text, TomlPropertyDisplayKind.Default) : string.Empty)}");
50122
}
51123
}
52-
53-
54-
var actual = builder.ToString();
55-
var expected = @"trivia: (1,1)-(1,19) Comment ""# This is a comment""
56-
trivia: (1,20)-(1,21) NewLine ""\r\n""
57-
token: (2,1)-(2,1) ""[""
58-
token: (2,2)-(2,6) ""table""
59-
token: (2,7)-(2,7) ""]""
60-
token: (2,8)-(2,9) ""\r\n""
61-
token: (3,1)-(3,3) ""key""
62-
trivia: (3,4)-(3,4) Whitespaces "" ""
63-
token: (3,5)-(3,5) ""=""
64-
trivia: (3,6)-(3,6) Whitespaces "" ""
65-
token: (3,7)-(3,7) ""1""
66-
trivia: (3,8)-(3,8) Whitespaces "" ""
67-
trivia: (3,9)-(3,33) Comment ""# This is another comment""
68-
token: (3,34)-(3,35) ""\r\n""
69-
token: (4,1)-(4,4) ""test""
70-
token: (4,5)-(4,5) "".""
71-
token: (4,6)-(4,8) ""sub""
72-
token: (4,9)-(4,9) "".""
73-
token: (4,10)-(4,12) ""key""
74-
trivia: (4,13)-(4,13) Whitespaces "" ""
75-
token: (4,14)-(4,14) ""=""
76-
trivia: (4,15)-(4,15) Whitespaces "" ""
77-
token: (4,16)-(4,20) ""\""yes\""""
78-
token: (4,21)-(4,22) ""\r\n""
79-
token: (5,1)-(5,2) ""[[""
80-
token: (5,3)-(5,7) ""array""
81-
token: (5,8)-(5,9) ""]]""
82-
token: (5,10)-(5,11) ""\r\n""
83-
token: (6,1)-(6,5) ""hello""
84-
trivia: (6,6)-(6,6) Whitespaces "" ""
85-
token: (6,7)-(6,7) ""=""
86-
trivia: (6,8)-(6,8) Whitespaces "" ""
87-
token: (6,9)-(6,12) ""true""
88-
token: (6,13)-(6,14) ""\r\n""
89-
";
90-
//Console.WriteLine(builder.ToString());
91-
92-
AssertHelper.AreEqualNormalizeNewLine(expected, actual, true);
124+
125+
var docStr = builder.ToString();
126+
AssertHelper.AreEqualNormalizeNewLine(expected, docStr, true);
93127
}
94-
95-
96128
}

src/Tomlyn/Parsing/Parser.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -371,15 +371,10 @@ private InlineTableSyntax ParseInlineTable()
371371

372372
var previousState = _lexer.State;
373373
_lexer.State = LexerState.Key;
374-
var previousLine = _hideNewLine;
375-
_hideNewLine = false;
376374
inlineTable.OpenBrace = EatToken(TokenKind.OpenBrace);
377375
try
378376
{
379377

380-
// toml-specs: Inline tables are intended to appear on a single line.
381-
// -> So we don't hide newlines
382-
383378
bool? expectingEndOfInitializer = null;
384379

385380
var previousSpan = inlineTable.OpenBrace.Span;
@@ -392,7 +387,6 @@ private InlineTableSyntax ParseInlineTable()
392387
LogError(previousSpan, $"Unexpected trailing comma `,` not permitted after the last key/value pair in an inline table.");
393388
}
394389

395-
_hideNewLine = previousLine;
396390
_lexer.State = previousState;
397391
inlineTable.CloseBrace = EatToken();
398392
break;
@@ -428,7 +422,6 @@ private InlineTableSyntax ParseInlineTable()
428422
finally
429423
{
430424
_lexer.State = previousState;
431-
_hideNewLine = previousLine;
432425
}
433426

434427
return Close(inlineTable);

0 commit comments

Comments
 (0)