From 6ac53f5f397cc0516ff6cca5acb8c86e65645fc3 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Tue, 17 May 2022 20:14:54 +0100 Subject: [PATCH] Improve table stringifier when line breaks enabled --- Analysis/src/ToString.cpp | 25 +++++++++++++++++-------- tests/ToString.test.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/Analysis/src/ToString.cpp b/Analysis/src/ToString.cpp index 380ac456..4979f2d0 100644 --- a/Analysis/src/ToString.cpp +++ b/Analysis/src/ToString.cpp @@ -594,22 +594,22 @@ struct TypeVarStringifier { case TableState::Sealed: state.result.invalid = true; - openbrace = "{| "; - closedbrace = " |}"; + openbrace = "{|"; + closedbrace = "|}"; break; case TableState::Unsealed: - openbrace = "{ "; - closedbrace = " }"; + openbrace = "{"; + closedbrace = "}"; break; case TableState::Free: state.result.invalid = true; - openbrace = "{- "; - closedbrace = " -}"; + openbrace = "{-"; + closedbrace = "-}"; break; case TableState::Generic: state.result.invalid = true; - openbrace = "{+ "; - closedbrace = " +}"; + openbrace = "{+"; + closedbrace = "+}"; break; } @@ -628,6 +628,7 @@ struct TypeVarStringifier bool comma = false; if (ttv.indexer) { + state.newline(); state.emit("["); stringify(ttv.indexer->indexType); state.emit("]: "); @@ -644,6 +645,10 @@ struct TypeVarStringifier state.emit(","); state.newline(); } + else + { + state.newline(); + } size_t length = state.result.name.length() - oldLength; @@ -670,6 +675,10 @@ struct TypeVarStringifier } state.dedent(); + if (comma) + state.newline(); + else + state.emit(" "); state.emit(closedbrace); state.unsee(&ttv); diff --git a/tests/ToString.test.cpp b/tests/ToString.test.cpp index f38dd10a..c9ecb354 100644 --- a/tests/ToString.test.cpp +++ b/tests/ToString.test.cpp @@ -60,6 +60,40 @@ TEST_CASE_FIXTURE(Fixture, "named_table") CHECK_EQ("TheTable", toString(&table)); } +TEST_CASE_FIXTURE(Fixture, "empty_table") +{ + CheckResult result = check(R"( + local a: {} + )"); + + CHECK_EQ("{| |}", toString(requireType("a"))); + + // Should stay the same with useLineBreaks enabled + ToStringOptions opts; + opts.useLineBreaks = true; + CHECK_EQ("{| |}", toString(requireType("a"), opts)); +} + +TEST_CASE_FIXTURE(Fixture, "table_respects_use_line_break") +{ + CheckResult result = check(R"( + local a: { prop: string, anotherProp: number, thirdProp: boolean } + )"); + + ToStringOptions opts; + opts.useLineBreaks = true; + opts.indent = true; + + //clang-format off + CHECK_EQ("{|\n" + " anotherProp: number,\n" + " prop: string,\n" + " thirdProp: boolean\n" + "|}", + toString(requireType("a"), opts)); + //clang-format on +} + TEST_CASE_FIXTURE(BuiltinsFixture, "exhaustive_toString_of_cyclic_table") { CheckResult result = check(R"(