diff options
author | Christian Kandeler <[email protected]> | 2023-08-22 14:10:22 +0200 |
---|---|---|
committer | Christian Kandeler <[email protected]> | 2023-08-22 13:59:04 +0000 |
commit | b33b99e2d9e4c343f7427bcf1ccdf652e7575557 (patch) | |
tree | d531bf852be09078d8bf259b68e4b3a1ad8c55f8 /src/plugins/clangcodemodel/test | |
parent | 73c5cf29c45f4d6d098b4e52043661801a2ed499 (diff) |
ClangCodeModel: Take changes from header files into account immediately
... in the dependent sources. That's also how the built-in code model
behaves, but clangd itself only does this when a document is saved.
Change-Id: I52d6badb0b7f063e5924c05dbf83a6e9849c9f6f
Reviewed-by: David Schulz <[email protected]>
Diffstat (limited to 'src/plugins/clangcodemodel/test')
8 files changed, 65 insertions, 0 deletions
diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 190c0b55c76..54c9bfa7c1d 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -2061,6 +2061,47 @@ void ClangdTestExternalChanges::test() QVERIFY(waitForSignalOrTimeout(newClient, &ClangdClient::textMarkCreated, timeOutInMs())); } +ClangdTestIndirectChanges::ClangdTestIndirectChanges() +{ + setProjectFileName("indirect-changes.pro"); + setSourceFileNames({"main.cpp", "directheader.h", "indirectheader.h", "unrelatedheader.h"}); +} + +void ClangdTestIndirectChanges::test() +{ + // Initially, everything is fine. + const TextDocument * const src = document("main.cpp"); + QVERIFY(src); + QVERIFY(src->marks().isEmpty()); + + // Write into an indirectly included header file. Our source file should have diagnostics now. + const TextDocument * const indirectHeader = document("indirectheader.h"); + QVERIFY(indirectHeader); + QTextCursor cursor(indirectHeader->document()); + cursor.insertText("blubb"); + while (src->marks().isEmpty()) + QVERIFY(waitForSignalOrTimeout(client(), &ClangdClient::textMarkCreated, timeOutInMs())); + + // Remove the inserted text again; the diagnostics should disappear. + cursor.document()->undo(); + QVERIFY(cursor.document()->toPlainText().isEmpty()); + while (!src->marks().isEmpty()) { + QVERIFY(waitForSignalOrTimeout(client(), &ClangdClient::highlightingResultsReady, + timeOutInMs())); + } + + // Now write into a header file that is not included anywhere. + // We expect diagnostics only for the header itself. + const TextDocument * const unrelatedHeader = document("unrelatedheader.h"); + QVERIFY(indirectHeader); + QTextCursor cursor2(unrelatedHeader->document()); + cursor2.insertText("blubb"); + while (waitForSignalOrTimeout(client(), &ClangdClient::textMarkCreated, timeOutInMs())) + ; + QVERIFY(!unrelatedHeader->marks().isEmpty()); + QVERIFY(src->marks().isEmpty()); +} + } // namespace Tests } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/test/clangdtests.h b/src/plugins/clangcodemodel/test/clangdtests.h index 92bf4efe90c..9d6e42d3a9e 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.h +++ b/src/plugins/clangcodemodel/test/clangdtests.h @@ -188,6 +188,17 @@ private slots: void test(); }; +class ClangdTestIndirectChanges : public ClangdTest +{ + Q_OBJECT + +public: + ClangdTestIndirectChanges(); + +private slots: + void test(); +}; + } // namespace Tests } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc index 1ee4bdee92c..f61e3f0633b 100644 --- a/src/plugins/clangcodemodel/test/data/clangtestdata.qrc +++ b/src/plugins/clangcodemodel/test/data/clangtestdata.qrc @@ -60,5 +60,10 @@ <file>fixits/diagnostic_comparison_fixit.cpp</file> <file>fixits/diagnostic_semicolon_fixit_expected.cpp</file> <file>fixits/diagnostic_semicolon_fixit.cpp</file> + <file>indirect-changes/directheader.h</file> + <file>indirect-changes/indirect-changes.pro</file> + <file>indirect-changes/indirectheader.h</file> + <file>indirect-changes/main.cpp</file> + <file>indirect-changes/unrelatedheader.h</file> </qresource> </RCC> diff --git a/src/plugins/clangcodemodel/test/data/indirect-changes/directheader.h b/src/plugins/clangcodemodel/test/data/indirect-changes/directheader.h new file mode 100644 index 00000000000..9ab7726e456 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/indirect-changes/directheader.h @@ -0,0 +1 @@ +#include "indirectheader.h" diff --git a/src/plugins/clangcodemodel/test/data/indirect-changes/indirect-changes.pro b/src/plugins/clangcodemodel/test/data/indirect-changes/indirect-changes.pro new file mode 100644 index 00000000000..b1648532ca6 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/indirect-changes/indirect-changes.pro @@ -0,0 +1,4 @@ +CONFIG -= qt + +SOURCES = main.cpp +HEADERS = directheader.h indirectheader.h unrelatedheader.h diff --git a/src/plugins/clangcodemodel/test/data/indirect-changes/indirectheader.h b/src/plugins/clangcodemodel/test/data/indirect-changes/indirectheader.h new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/indirect-changes/indirectheader.h diff --git a/src/plugins/clangcodemodel/test/data/indirect-changes/main.cpp b/src/plugins/clangcodemodel/test/data/indirect-changes/main.cpp new file mode 100644 index 00000000000..63ae802b071 --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/indirect-changes/main.cpp @@ -0,0 +1,3 @@ +#include "directheader.h" + +int main() {} diff --git a/src/plugins/clangcodemodel/test/data/indirect-changes/unrelatedheader.h b/src/plugins/clangcodemodel/test/data/indirect-changes/unrelatedheader.h new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/src/plugins/clangcodemodel/test/data/indirect-changes/unrelatedheader.h |