mirror of
https://github.com/luau-lang/luau.git
synced 2025-05-04 10:33:46 +01:00
Modify the way line breaks are added when printing unions/intersections
This commit is contained in:
parent
309001020a
commit
0ab3db5c29
3 changed files with 57 additions and 5 deletions
|
@ -47,6 +47,7 @@ struct ToStringOptions
|
|||
bool hideFunctionSelfArgument = false; // If true, `self: X` will be omitted from the function signature if the function has self
|
||||
size_t maxTableLength = size_t(FInt::LuauTableTypeMaximumStringifierLength); // Only applied to TableTypes
|
||||
size_t maxTypeLength = size_t(FInt::LuauTypeMaximumStringifierLength);
|
||||
size_t compositeTypesSingleLineLimit = 5; // The number of type elements permitted on a single line when printing type unions/intersections
|
||||
ToStringNameMap nameMap;
|
||||
std::shared_ptr<Scope> scope; // If present, module names will be added and types that are not available in scope will be marked as 'invalid'
|
||||
std::vector<std::string> namedFunctionOverrideArgNames; // If present, named function argument names will be overridden
|
||||
|
|
|
@ -851,11 +851,15 @@ struct TypeStringifier
|
|||
state.emit("(");
|
||||
|
||||
bool first = true;
|
||||
bool shouldPlaceOnNewlines = results.size() > state.opts.compositeTypesSingleLineLimit;
|
||||
for (std::string& ss : results)
|
||||
{
|
||||
if (!first)
|
||||
{
|
||||
state.newline();
|
||||
if (shouldPlaceOnNewlines)
|
||||
state.newline();
|
||||
else
|
||||
state.emit(" ");
|
||||
state.emit("| ");
|
||||
}
|
||||
state.emit(ss);
|
||||
|
@ -875,7 +879,7 @@ struct TypeStringifier
|
|||
}
|
||||
}
|
||||
|
||||
void operator()(TypeId, const IntersectionType& uv)
|
||||
void operator()(TypeId ty, const IntersectionType& uv)
|
||||
{
|
||||
if (state.hasSeen(&uv))
|
||||
{
|
||||
|
@ -911,11 +915,15 @@ struct TypeStringifier
|
|||
std::sort(results.begin(), results.end());
|
||||
|
||||
bool first = true;
|
||||
bool shouldPlaceOnNewlines = results.size() > state.opts.compositeTypesSingleLineLimit || isOverloadedFunction(ty);
|
||||
for (std::string& ss : results)
|
||||
{
|
||||
if (!first)
|
||||
{
|
||||
state.newline();
|
||||
if (shouldPlaceOnNewlines)
|
||||
state.newline();
|
||||
else
|
||||
state.emit(" ");
|
||||
state.emit("& ");
|
||||
}
|
||||
state.emit(ss);
|
||||
|
|
|
@ -214,7 +214,37 @@ TEST_CASE_FIXTURE(Fixture, "functions_are_always_parenthesized_in_unions_or_inte
|
|||
CHECK_EQ(toString(&itv), "((number, string) -> (string, number)) & ((string, number) -> (number, string))");
|
||||
}
|
||||
|
||||
TEST_CASE_FIXTURE(Fixture, "intersections_respects_use_line_breaks")
|
||||
TEST_CASE_FIXTURE(Fixture, "simple_intersections_printed_on_one_line")
|
||||
{
|
||||
CheckResult result = check(R"(
|
||||
local a: string & number
|
||||
)");
|
||||
|
||||
ToStringOptions opts;
|
||||
opts.useLineBreaks = true;
|
||||
|
||||
CHECK_EQ("number & string", toString(requireType("a"), opts));
|
||||
}
|
||||
|
||||
TEST_CASE_FIXTURE(Fixture, "complex_intersections_printed_on_multiple_lines")
|
||||
{
|
||||
CheckResult result = check(R"(
|
||||
local a: string & number & boolean
|
||||
)");
|
||||
|
||||
ToStringOptions opts;
|
||||
opts.useLineBreaks = true;
|
||||
opts.compositeTypesSingleLineLimit = 2;
|
||||
|
||||
//clang-format off
|
||||
CHECK_EQ("boolean\n"
|
||||
"& number\n"
|
||||
"& string",
|
||||
toString(requireType("a"), opts));
|
||||
//clang-format on
|
||||
}
|
||||
|
||||
TEST_CASE_FIXTURE(Fixture, "overloaded_functions_always_printed_on_multiple_lines")
|
||||
{
|
||||
CheckResult result = check(R"(
|
||||
local a: ((string) -> string) & ((number) -> number)
|
||||
|
@ -230,13 +260,26 @@ TEST_CASE_FIXTURE(Fixture, "intersections_respects_use_line_breaks")
|
|||
//clang-format on
|
||||
}
|
||||
|
||||
TEST_CASE_FIXTURE(Fixture, "unions_respects_use_line_breaks")
|
||||
TEST_CASE_FIXTURE(Fixture, "simple_unions_printed_on_one_line")
|
||||
{
|
||||
CheckResult result = check(R"(
|
||||
local a: number | boolean
|
||||
)");
|
||||
|
||||
ToStringOptions opts;
|
||||
opts.useLineBreaks = true;
|
||||
|
||||
CHECK_EQ("boolean | number", toString(requireType("a"), opts));
|
||||
}
|
||||
|
||||
TEST_CASE_FIXTURE(Fixture, "complex_unions_printed_on_multiple_lines")
|
||||
{
|
||||
CheckResult result = check(R"(
|
||||
local a: string | number | boolean
|
||||
)");
|
||||
|
||||
ToStringOptions opts;
|
||||
opts.compositeTypesSingleLineLimit = 2;
|
||||
opts.useLineBreaks = true;
|
||||
|
||||
//clang-format off
|
||||
|
|
Loading…
Add table
Reference in a new issue