Author: Sam McCall Date: 2022-10-19T00:21:33+02:00 New Revision: 25bac38a02e3d43a16282d66c38084bcd553c9b5
URL: https://github.com/llvm/llvm-project/commit/25bac38a02e3d43a16282d66c38084bcd553c9b5 DIFF: https://github.com/llvm/llvm-project/commit/25bac38a02e3d43a16282d66c38084bcd553c9b5.diff LOG: [include-cleaner] Add line numbers to HTML output Added: Modified: clang-tools-extra/include-cleaner/lib/HTMLReport.cpp clang-tools-extra/include-cleaner/test/CMakeLists.txt clang-tools-extra/include-cleaner/unittests/RecordTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp b/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp index c7bfc369776fa..191fa554be966 100644 --- a/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp +++ b/clang-tools-extra/include-cleaner/lib/HTMLReport.cpp @@ -25,7 +25,16 @@ namespace clang::include_cleaner { namespace { constexpr llvm::StringLiteral CSS = R"css( - pre { line-height: 1.5em; } + body { margin: 0; } + pre { line-height: 1.5em; counter-reset: line; margin: 0; } + pre .line { counter-increment: line; } + pre .line::before { + content: counter(line); + display: inline-block; + background-color: #eee; border-right: 1px solid #ccc; + text-align: right; + width: 3em; padding-right: 0.5em; margin-right: 0.5em; + } .ref { text-decoration: underline; color: #008; } .sel { position: relative; cursor: pointer; } #hover { @@ -83,10 +92,12 @@ class Reporter { const SourceManager &SM; FileID File; + // Symbols that are referenced from the main file. struct Target { const NamedDecl *D; }; std::vector<Target> Targets; + // Points within the main file that reference a Target. std::vector<std::pair</*Offset*/ unsigned, /*TargetIndex*/ unsigned>> Refs; public: @@ -94,11 +105,17 @@ class Reporter { : OS(OS), Ctx(Ctx), SM(Ctx.getSourceManager()), File(File) {} void addRef(SourceLocation Loc, const NamedDecl &D) { - auto Coords = SM.getDecomposedLoc(SM.getFileLoc(Loc)); - if (Coords.first != File) - llvm::errs() << "Ref location outside file!\n"; + auto [File, Offset] = SM.getDecomposedLoc(SM.getFileLoc(Loc)); + if (File != this->File) { + // Can get here e.g. if there's an #include inside a root Decl. + // FIXME: do something more useful than this. + llvm::errs() << "Ref location outside file! " + << D.getQualifiedNameAsString() << " at " + << Loc.printToString(SM) << "\n"; + return; + } Targets.push_back({&D}); - Refs.push_back({Coords.second, Targets.size() - 1}); + Refs.push_back({Offset, Targets.size() - 1}); } void write() { @@ -154,11 +171,13 @@ class Reporter { llvm::sort(Refs); llvm::StringRef Code = SM.getBufferData(File); - OS << "<pre onclick='select(event)'>"; + OS << "<pre onclick='select(event)' class='code'>"; + OS << "<code class='line'>"; auto Rest = llvm::makeArrayRef(Refs); unsigned End = 0; for (unsigned I = 0; I < Code.size(); ++I) { - if (End == I && I > 0) { + // Finish refs early at EOL to avoid dealing with splitting the span. + if (End && (End == I || Code[I] == '\n')) { OS << "</span>"; End = 0; } @@ -178,9 +197,12 @@ class Reporter { End = I + Lexer::MeasureTokenLength(SM.getComposedLoc(File, I), SM, Ctx.getLangOpts()); } - escapeChar(Code[I]); + if (Code[I] == '\n') + OS << "</code>\n<code class='line'>"; + else + escapeChar(Code[I]); } - OS << "</pre>\n"; + OS << "</code></pre>\n"; } }; diff --git a/clang-tools-extra/include-cleaner/test/CMakeLists.txt b/clang-tools-extra/include-cleaner/test/CMakeLists.txt index a31858f13aedf..78525344d4248 100644 --- a/clang-tools-extra/include-cleaner/test/CMakeLists.txt +++ b/clang-tools-extra/include-cleaner/test/CMakeLists.txt @@ -1,5 +1,6 @@ set(CLANG_INCLUDE_CLEANER_TEST_DEPS ClangIncludeCleanerTests + clang-include-cleaner ) foreach (dep FileCheck not count) diff --git a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp index 898ac1b526839..8eaa3ffb43672 100644 --- a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp +++ b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp @@ -1,3 +1,11 @@ +//===-- RecordTest.cpp ----------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + #include "clang-include-cleaner/Record.h" #include "clang/Frontend/FrontendAction.h" #include "clang/Testing/TestAST.h" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits