diff --git a/verilog/formatting/formatter_test.cc b/verilog/formatting/formatter_test.cc index e313bdc85..c0c26bc7c 100644 --- a/verilog/formatting/formatter_test.cc +++ b/verilog/formatting/formatter_test.cc @@ -157,6 +157,14 @@ static const std::initializer_list kFormatterTestCases = { "`ifndef FOO\n" "`define BAR\n\n" "`endif\n"}, + {"`define FOO \\\n" + " BAR\n", + "`define FOO \\\n" // TODO(b/72527558): right align '\'s to column limit + " BAR\n"}, + {"`define FOOOOOOOOOOOOOOOO \\\n" + " BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n", + "`define FOOOOOOOOOOOOOOOO \\\n" // macro text starts at '\' + " BAAAAAAAAAAAAAAAAR BAAAAAAAAAAAAAZ;\n"}, {"`ifdef FOO\n" " `fine()\n" "`else\n" diff --git a/verilog/formatting/token_annotator.cc b/verilog/formatting/token_annotator.cc index 201dccd59..5c4319852 100644 --- a/verilog/formatting/token_annotator.cc +++ b/verilog/formatting/token_annotator.cc @@ -590,6 +590,18 @@ static WithReason BreakDecisionBetween( } } + if (left.TokenEnum() == PP_define) { + return {SpacingOptions::MustAppend, + "Keep `define and macro name together."}; + } + if (right.TokenEnum() == PP_define_body) { + // TODO(b/141517267): reflow macro definition text with flexible + // line-continuations. + return {SpacingOptions::MustAppend, + "Macro definition body must start on same line (but may be " + "line-continued)."}; + } + // Check for mandatory line breaks. if (left.format_token_enum == FTT::eol_comment || left.TokenEnum() == PP_define_body // definition excludes trailing '\n' diff --git a/verilog/formatting/token_annotator_test.cc b/verilog/formatting/token_annotator_test.cc index 7fd8efdcd..5b0716046 100644 --- a/verilog/formatting/token_annotator_test.cc +++ b/verilog/formatting/token_annotator_test.cc @@ -782,7 +782,7 @@ TEST(TokenAnnotatorTest, AnnotateFormattingInfoTest) { {DefaultStyle, 0, {{0, SpacingOptions::Undecided}, // `define - {1, SpacingOptions::Undecided}, // FOO + {1, SpacingOptions::MustAppend}, // FOO {0, SpacingOptions::Undecided}, // ( {0, SpacingOptions::Undecided}, // name {1, SpacingOptions::Undecided}, // = @@ -1086,12 +1086,12 @@ TEST(TokenAnnotatorTest, AnnotateFormattingInfoTest) { {DefaultStyle, 1, { - {0, SpacingOptions::Undecided}, // `define - {1, SpacingOptions::Undecided}, // FOO - {0, SpacingOptions::Undecided}, // "" (empty definition body) - {0, SpacingOptions::MustWrap}, // `define - {1, SpacingOptions::Undecided}, // BAR - {0, SpacingOptions::Undecided}, // "" (empty definition body) + {0, SpacingOptions::Undecided}, // `define + {1, SpacingOptions::MustAppend}, // FOO + {0, SpacingOptions::MustAppend}, // "" (empty definition body) + {0, SpacingOptions::MustWrap}, // `define + {1, SpacingOptions::MustAppend}, // BAR + {0, SpacingOptions::MustAppend}, // "" (empty definition body) }, { {yytokentype::PP_define, "`define"}, @@ -1107,12 +1107,12 @@ TEST(TokenAnnotatorTest, AnnotateFormattingInfoTest) { {DefaultStyle, 1, { - {0, SpacingOptions::Undecided}, // `define - {1, SpacingOptions::Undecided}, // FOO - {1, SpacingOptions::Undecided}, // 1 - {1, SpacingOptions::MustWrap}, // `define - {1, SpacingOptions::Undecided}, // BAR - {1, SpacingOptions::Undecided}, // 2 + {0, SpacingOptions::Undecided}, // `define + {1, SpacingOptions::MustAppend}, // FOO + {1, SpacingOptions::MustAppend}, // 1 + {1, SpacingOptions::MustWrap}, // `define + {1, SpacingOptions::MustAppend}, // BAR + {1, SpacingOptions::MustAppend}, // 2 }, { {yytokentype::PP_define, "`define"}, @@ -1130,26 +1130,26 @@ TEST(TokenAnnotatorTest, AnnotateFormattingInfoTest) { 1, { {0, SpacingOptions::Undecided}, // `define - {1, SpacingOptions::Undecided}, // FOO + {1, SpacingOptions::MustAppend}, // FOO {0, SpacingOptions::MustAppend}, // ( {0, SpacingOptions::Undecided}, // ) - {0, SpacingOptions::Undecided}, // "" (empty definition body) + {0, SpacingOptions::MustAppend}, // "" (empty definition body) {0, SpacingOptions::MustWrap}, // `define - {1, SpacingOptions::Undecided}, // BAR + {1, SpacingOptions::MustAppend}, // BAR {0, SpacingOptions::MustAppend}, // ( {0, SpacingOptions::Undecided}, // x {0, SpacingOptions::Undecided}, // ) - {0, SpacingOptions::Undecided}, // "" (empty definition body) + {0, SpacingOptions::MustAppend}, // "" (empty definition body) {0, SpacingOptions::MustWrap}, // `define - {1, SpacingOptions::Undecided}, // BAZ + {1, SpacingOptions::MustAppend}, // BAZ {0, SpacingOptions::MustAppend}, // ( {0, SpacingOptions::Undecided}, // y {0, SpacingOptions::Undecided}, // , {1, SpacingOptions::Undecided}, // z {0, SpacingOptions::Undecided}, // ) - {0, SpacingOptions::Undecided}, // "" (empty definition body) + {0, SpacingOptions::MustAppend}, // "" (empty definition body) }, { {yytokentype::PP_define, "`define"}, @@ -1181,13 +1181,13 @@ TEST(TokenAnnotatorTest, AnnotateFormattingInfoTest) { 1, { {0, SpacingOptions::Undecided}, // `define - {1, SpacingOptions::Undecided}, // ADD + {1, SpacingOptions::MustAppend}, // ADD {0, SpacingOptions::MustAppend}, // ( {0, SpacingOptions::Undecided}, // y {0, SpacingOptions::Undecided}, // , {1, SpacingOptions::Undecided}, // z {0, SpacingOptions::Undecided}, // ) - {1, SpacingOptions::Undecided}, // "y+z" + {1, SpacingOptions::MustAppend}, // "y+z" }, { {yytokentype::PP_define, "`define"}, @@ -1977,6 +1977,13 @@ TEST(TokenAnnotatorTest, AnnotateFormattingWithContextTest) { {}, // any context {1, SpacingOptions::MustWrap}, }, + { + DefaultStyle, + {yytokentype::PP_define, "`define"}, + {SymbolIdentifier, "ID"}, + {}, // any context + {1, SpacingOptions::MustAppend}, + }, { DefaultStyle, {TK_StringLiteral, "\"lost/file.svh\""},