diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 4b5c2b8f662b22faac9d8c758d5fe6be37654212..ee9b463e9032bc02faeed30d8915863a769432ca 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -16,15 +16,21 @@ /// //===----------------------------------------------------------------------===// -#include "clang/Format/Format.h" +#define DEBUG_TYPE "format-formatter" + #include "UnwrappedLineParser.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/OperatorPrecedence.h" #include "clang/Basic/SourceManager.h" +#include "clang/Format/Format.h" #include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Lex/Lexer.h" +#include "llvm/Support/Debug.h" #include <string> +// Uncomment to get debug output from tests: +// #define DEBUG_WITH_TYPE(T, X) do { X; } while(0) + namespace clang { namespace format { @@ -246,6 +252,10 @@ public: State.LineContainsContinuedForLoopSection = false; State.StartOfLineLevel = 1; + DEBUG({ + DebugTokenState(*State.NextToken); + }); + // The first token has already been indented and thus consumed. moveStateToNextToken(State); @@ -262,6 +272,18 @@ public: } else { unsigned NoBreak = calcPenalty(State, false, UINT_MAX); unsigned Break = calcPenalty(State, true, NoBreak); + DEBUG({ + if (Break < NoBreak) + llvm::errs() << "\n"; + else + llvm::errs() << " "; + llvm::errs() << "<"; + DebugPenalty(Break, Break < NoBreak); + llvm::errs() << "/"; + DebugPenalty(NoBreak, !(Break < NoBreak)); + llvm::errs() << "> "; + DebugTokenState(*State.NextToken); + }); addTokenToState(Break < NoBreak, false, State); if (State.NextToken != NULL && State.NextToken->Parent->Type == TT_CtorInitializerColon) { @@ -271,10 +293,28 @@ public: } } } + DEBUG(llvm::errs() << "\n"); return State.Column; } private: + void DebugTokenState(const AnnotatedToken &AnnotatedTok) { + const Token &Tok = AnnotatedTok.FormatTok.Tok; + llvm::errs() + << StringRef(SourceMgr.getCharacterData(Tok.getLocation()), + Tok.getLength()); + llvm::errs(); + } + + void DebugPenalty(unsigned Penalty, bool Winner) { + llvm::errs().changeColor(Winner ? raw_ostream::GREEN : raw_ostream::RED); + if (Penalty == UINT_MAX) + llvm::errs() << "MAX"; + else + llvm::errs() << Penalty; + llvm::errs().resetColor(); + } + struct ParenState { ParenState(unsigned Indent, unsigned LastSpace) : Indent(Indent), LastSpace(LastSpace), FirstLessLess(0), diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index e8b334bb3d8fe01d7e3f049c5053abbf2360d1fb..89ab0ed169d79e8877a6f53e601ac0314abb4fb7 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -20,7 +20,6 @@ #include "clang/Basic/Diagnostic.h" #include "llvm/Support/Debug.h" -#include "llvm/Support/raw_ostream.h" #include "UnwrappedLineParser.h" // Uncomment to get debug output from tests: diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index e75d61e662b4eac892b1929b7633c4d278860647..efea545d320e18c6995b6534b932c594ef939fcd 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -7,10 +7,16 @@ // //===----------------------------------------------------------------------===// +#define DEBUG_TYPE "format-test" + #include "clang/Format/Format.h" -#include "../Tooling/RewriterTestContext.h" #include "clang/Lex/Lexer.h" #include "gtest/gtest.h" +#include "llvm/Support/Debug.h" +#include "../Tooling/RewriterTestContext.h" + +// Uncomment to get debug output from tests: +// #define DEBUG_WITH_TYPE(T, X) do { X; } while(0) namespace clang { namespace format { @@ -19,6 +25,7 @@ class FormatTest : public ::testing::Test { protected: std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length, const FormatStyle &Style) { + DEBUG(llvm::errs() << "---\n"); RewriterTestContext Context; FileID ID = Context.createInMemoryFile("input.cc", Code); SourceLocation Start = @@ -32,6 +39,7 @@ protected: Ranges, new IgnoringDiagConsumer()); EXPECT_TRUE(applyAllReplacements(Replace, Context.Rewrite)); + DEBUG(llvm::errs() << "\n" << Context.getRewrittenText(ID) << "\n\n"); return Context.getRewrittenText(ID); }