https://github.com/PeterChou1 updated https://github.com/llvm/llvm-project/pull/93276
>From 0b6d536133f63e078fbde491a8c92c7ec916cb47 Mon Sep 17 00:00:00 2001 From: PeterChou1 <peter.c...@mail.utoronto.ca> Date: Fri, 24 May 2024 05:18:05 -0400 Subject: [PATCH 1/2] [clang-doc] make loading of json side bar async --- clang-tools-extra/clang-doc/HTMLGenerator.cpp | 28 +++++++++---------- clang-tools-extra/clang-doc/Representation.h | 1 + clang-tools-extra/clang-doc/assets/index.js | 5 ++-- .../clang-doc/tool/ClangDocMain.cpp | 6 +++- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/clang-tools-extra/clang-doc/HTMLGenerator.cpp b/clang-tools-extra/clang-doc/HTMLGenerator.cpp index c0faf5f7e8fd9..fb1a7f94c9094 100644 --- a/clang-tools-extra/clang-doc/HTMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/HTMLGenerator.cpp @@ -964,7 +964,7 @@ static llvm::Error SerializeIndex(ClangDocContext &CDCtx) { std::error_code FileErr; llvm::SmallString<128> FilePath; llvm::sys::path::native(CDCtx.OutDirectory, FilePath); - llvm::sys::path::append(FilePath, "index_json.js"); + llvm::sys::path::append(FilePath, "index.json"); llvm::raw_fd_ostream OS(FilePath, FileErr, llvm::sys::fs::OF_None); if (FileErr != OK) { return llvm::createStringError(llvm::inconvertibleErrorCode(), @@ -985,9 +985,7 @@ static llvm::Error SerializeIndex(ClangDocContext &CDCtx) { }); }); }; - OS << "var JsonIndex = `\n"; IndexToJSON(CDCtx.Idx); - OS << "`;\n"; return llvm::Error::success(); } @@ -1049,31 +1047,33 @@ static llvm::Error CopyFile(StringRef FilePath, StringRef OutDirectory) { std::error_code FileErr = llvm::sys::fs::copy_file(PathRead, PathWrite); if (FileErr != OK) { return llvm::createStringError(llvm::inconvertibleErrorCode(), - "error creating file " + - llvm::sys::path::filename(FilePath) + - ": " + FileErr.message() + "\n"); + "error creating file " + FilePath + ": " + + FileErr.message() + "\n"); } return llvm::Error::success(); } llvm::Error HTMLGenerator::createResources(ClangDocContext &CDCtx) { - auto Err = SerializeIndex(CDCtx); - if (Err) + if (auto Err = SerializeIndex(CDCtx)) { return Err; - Err = GenIndex(CDCtx); - if (Err) + } + + if (auto Err = GenIndex(CDCtx)) { return Err; + } for (const auto &FilePath : CDCtx.UserStylesheets) { - Err = CopyFile(FilePath, CDCtx.OutDirectory); - if (Err) + if (auto Err = CopyFile(FilePath, CDCtx.OutDirectory)) { return Err; + } } + for (const auto &FilePath : CDCtx.FilesToCopy) { - Err = CopyFile(FilePath, CDCtx.OutDirectory); - if (Err) + if (auto Err = CopyFile(FilePath, CDCtx.OutDirectory)) { return Err; + } } + return llvm::Error::success(); } diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h index a6b144eb7fa2a..23323f1cbdf46 100644 --- a/clang-tools-extra/clang-doc/Representation.h +++ b/clang-tools-extra/clang-doc/Representation.h @@ -491,6 +491,7 @@ struct ClangDocContext { std::string SourceRoot; // Directory where processed files are stored. Links // to definition locations will only be generated if // the file is in this dir. + // URL of repository that hosts code used for links to definition locations. std::optional<std::string> RepositoryUrl; // Path of CSS stylesheets that will be copied to OutDirectory and used to diff --git a/clang-tools-extra/clang-doc/assets/index.js b/clang-tools-extra/clang-doc/assets/index.js index a5ac90f2e06e7..379867268527e 100644 --- a/clang-tools-extra/clang-doc/assets/index.js +++ b/clang-tools-extra/clang-doc/assets/index.js @@ -82,6 +82,7 @@ function createIndex(Index) { document.addEventListener("DOMContentLoaded", function() { // JsonIndex is a variable from another file that contains the index // in JSON format - var Index = JSON.parse(JsonIndex); - createIndex(Index); + fetch("/index.json") + .then((response) => response.json()) + .then((Index) => { createIndex(Index); }); }); diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp index 21b581fa6df2e..53108a77dab21 100644 --- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp +++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp @@ -155,6 +155,10 @@ Example usage for a project using a compile commands database: return 1; } + // add option to customize url fragment + // such as + // https://github.com/llvm/llvm-project/blob/main/clang-tools-extra/clang-doc/ClangDocMain.cpp#L1 + // Fail early if an invalid format was provided. std::string Format = getFormatString(); llvm::outs() << "Emiting docs in " << Format << " format.\n"; @@ -179,7 +183,7 @@ Example usage for a project using a compile commands database: SourceRoot, RepositoryUrl, {UserStylesheets.begin(), UserStylesheets.end()}, - {"index.js", "index_json.js"}}; + {"index.js"}}; if (Format == "html") { void *MainAddr = (void *)(intptr_t)GetExecutablePath; >From 26dc42ff5f6f4fd4d2d0bea3dae785f70f835803 Mon Sep 17 00:00:00 2001 From: PeterChou1 <peter.c...@mail.utoronto.ca> Date: Thu, 30 May 2024 21:55:27 -0400 Subject: [PATCH 2/2] [clang-doc] add e2e unit test --- .../Inputs/clang-doc-project1/CMakeLists.txt | 14 ++++++ .../Inputs/clang-doc-project1/Calculator.cpp | 21 +++++++++ .../Inputs/clang-doc-project1/Calculator.h | 46 +++++++++++++++++++ .../Inputs/clang-doc-project1/Circle.cpp | 11 +++++ .../Inputs/clang-doc-project1/Circle.h | 35 ++++++++++++++ .../Inputs/clang-doc-project1/Rectangle.cpp | 12 +++++ .../Inputs/clang-doc-project1/Rectangle.h | 37 +++++++++++++++ .../Inputs/clang-doc-project1/Shape.h | 30 ++++++++++++ .../clang-doc-project1/database_template.json | 22 +++++++++ .../Inputs/clang-doc-project1/main.cpp | 25 ++++++++++ .../test/clang-doc/clang-doc-project1.cpp | 11 +++++ 11 files changed, 264 insertions(+) create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp create mode 100644 clang-tools-extra/test/clang-doc/clang-doc-project1.cpp diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt new file mode 100644 index 0000000000000..a865714e04b17 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/CMakeLists.txt @@ -0,0 +1,14 @@ +project(clang_doc_project1) + +set(CMAKE_CXX_STANDARD 17) + +# Add the executable +add_executable(ProjectClangDoc1 + src/main.cpp + src/Calculator.cpp + src/Circle.cpp + src/Rectangle.cpp +) + +# Include directories +target_include_directories(ProjectClangDoc1 PUBLIC include) diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp new file mode 100644 index 0000000000000..df1778c3b9d55 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp @@ -0,0 +1,21 @@ +#include "Calculator.h" +#include <stdexcept> + +int Calculator::add(int a, int b) { + return a + b; +} + +int Calculator::subtract(int a, int b) { + return a - b; +} + +int Calculator::multiply(int a, int b) { + return a * b; +} + +double Calculator::divide(int a, int b) { + if (b == 0) { + throw std::invalid_argument("Division by zero"); + } + return static_cast<double>(a) / b; +} diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h new file mode 100644 index 0000000000000..6811834bc0159 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h @@ -0,0 +1,46 @@ +#pragma once + +/** + * @brief A simple calculator class. + * + * Provides basic arithmetic operations. + */ +class Calculator { +public: + /** + * @brief Adds two integers. + * + * @param a First integer. + * @param b Second integer. + * @return int The sum of a and b. + */ + int add(int a, int b); + + /** + * @brief Subtracts the second integer from the first. + * + * @param a First integer. + * @param b Second integer. + * @return int The result of a - b. + */ + int subtract(int a, int b); + + /** + * @brief Multiplies two integers. + * + * @param a First integer. + * @param b Second integer. + * @return int The product of a and b. + */ + int multiply(int a, int b); + + /** + * @brief Divides the first integer by the second. + * + * @param a First integer. + * @param b Second integer. + * @return double The result of a / b. + * @throw std::invalid_argument if b is zero. + */ + double divide(int a, int b); +}; \ No newline at end of file diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp new file mode 100644 index 0000000000000..823384a4d97e8 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp @@ -0,0 +1,11 @@ +#include "Circle.h" + +Circle::Circle(double radius) : radius_(radius) {} + +double Circle::area() const { + return 3.141 * radius_ * radius_; +} + +double Circle::perimeter() const { + return 3.141 * radius_; +} \ No newline at end of file diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h new file mode 100644 index 0000000000000..7bee3ffa92539 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h @@ -0,0 +1,35 @@ +#pragma once + +#include "Shape.h" + +/** + * @brief Circle class derived from Shape. + * + * Represents a circle with a given radius. + */ +class Circle : public Shape { +public: + /** + * @brief Constructs a new Circle object. + * + * @param radius Radius of the circle. + */ + Circle(double radius); + + /** + * @brief Calculates the area of the circle. + * + * @return double The area of the circle. + */ + double area() const override; + + /** + * @brief Calculates the perimeter of the circle. + * + * @return double The perimeter of the circle. + */ + double perimeter() const override; + +private: + double radius_; ///< Radius of the circle. +}; diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp new file mode 100644 index 0000000000000..7ffc769157ebc --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp @@ -0,0 +1,12 @@ +#include "Rectangle.h" + +Rectangle::Rectangle(double width, double height) + : width_(width), height_(height) {} + +double Rectangle::area() const { + return width_ * height_; +} + +double Rectangle::perimeter() const { + return 2 * (width_ + height_); +} \ No newline at end of file diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h new file mode 100644 index 0000000000000..8c6223a4f6180 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h @@ -0,0 +1,37 @@ +#pragma once + +#include "Shape.h" + +/** + * @brief Rectangle class derived from Shape. + * + * Represents a rectangle with a given width and height. + */ +class Rectangle : public Shape { +public: + /** + * @brief Constructs a new Rectangle object. + * + * @param width Width of the rectangle. + * @param height Height of the rectangle. + */ + Rectangle(double width, double height); + + /** + * @brief Calculates the area of the rectangle. + * + * @return double The area of the rectangle. + */ + double area() const override; + + /** + * @brief Calculates the perimeter of the rectangle. + * + * @return double The perimeter of the rectangle. + */ + double perimeter() const override; + +private: + double width_; ///< Width of the rectangle. + double height_; ///< Height of the rectangle. +}; \ No newline at end of file diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h new file mode 100644 index 0000000000000..e5c5d4c9e4412 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h @@ -0,0 +1,30 @@ +#pragma once + +/** + * @brief Abstract base class for shapes. + * + * Provides a common interface for different types of shapes. + */ +class Shape { +public: + /** + * @brief Virtual destructor. + */ + virtual ~Shape() {} + + /** + * @brief Calculates the area of the shape. + * + * @return double The area of the shape. + */ + virtual double area() const = 0; + + /** + * @brief Calculates the perimeter of the shape. + * + * @return double The perimeter of the shape. + */ + virtual double perimeter() const = 0; +}; + + diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json new file mode 100644 index 0000000000000..0549c5b718f08 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json @@ -0,0 +1,22 @@ +[ +{ + "directory": "$test_dir/build", + "command": "clang++ -o main.o -I../include $test_dir/src/main.cpp", + "file": "$test_dir/src/main.cpp" +}, +{ + "directory": "$test_dir/build", + "command": "clang++ -o Calculator.o -I../include $test_dir/src/Calculator.cpp", + "file": "$test_dir/src/Calculator.cpp" +}, +{ + "directory": "$test_dir/build", + "command": "clang++ -o Circle.o -I../include $test_dir/src/Circle.cpp", + "file": "$test_dir/src/Circle.cpp" +}, +{ + "directory": "$test_dir/build", + "command": "clang++ -o Rectangle.o -I../include $test_dir/src/Rectangle.cpp", + "file": "$test_dir/src/Rectangle.cpp" +} +] \ No newline at end of file diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp new file mode 100644 index 0000000000000..e20732c7de371 --- /dev/null +++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/main.cpp @@ -0,0 +1,25 @@ +#include <iostream> +#include "Calculator.h" +#include "Circle.h" +#include "Rectangle.h" + +int main() { + // Calculator + Calculator calc; + std::cout << "Add: " << calc.add(3, 4) << std::endl; + std::cout << "Subtract: " << calc.subtract(10, 5) << std::endl; + std::cout << "Multiply: " << calc.multiply(2, 3) << std::endl; + std::cout << "Divide: " << calc.divide(10, 2) << std::endl; + + // Circle + Circle circle(5.0); + std::cout << "Circle Area: " << circle.area() << std::endl; + std::cout << "Circle Perimeter: " << circle.perimeter() << std::endl; + + // Rectangle + Rectangle rectangle(4.0, 6.0); + std::cout << "Rectangle Area: " << rectangle.area() << std::endl; + std::cout << "Rectangle Perimeter: " << rectangle.perimeter() << std::endl; + + return 0; +} \ No newline at end of file diff --git a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp new file mode 100644 index 0000000000000..8c0289519854d --- /dev/null +++ b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp @@ -0,0 +1,11 @@ +// RUN: mkdir -p %T/clang-doc/build +// RUN: mkdir -p %T/clang-doc/include +// RUN: mkdir -p %T/clang-doc/src +// RUN: mkdir -p %T/clang-doc/docs +// RUN: sed 's|$test_dir|%/T/clang-doc|g' %S/Inputs/clang-doc-project1/database_template.json > %T/clang-doc/build/compile_commands.json +// RUN: cp %S/Inputs/clang-doc-project1/*.h %T/clang-doc/include +// RUN: cp %S/Inputs/clang-doc-project1/*.cpp %T/clang-doc/src +// RUN: cd %T/clang-doc/build +// RUN: clang-doc --format=html --executor=all-TUs --output=%T/clang-doc/docs ./compile_commands.json + + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits