Author: Access Date: 2026-07-15T16:44:02+03:00 New Revision: 25682c3470410534c59708d7d3e2c9248802485f
URL: https://github.com/llvm/llvm-project/commit/25682c3470410534c59708d7d3e2c9248802485f DIFF: https://github.com/llvm/llvm-project/commit/25682c3470410534c59708d7d3e2c9248802485f.diff LOG: [clangd] highlight import and export keywords for C++20 modules (#204511) Add syntax highlighting for C++20 module `import` and `export` keywords. Note: Highlighting of the `export` keyword in a module export statement is not possible, because such statements don't appear in the AST Added: Modified: clang-tools-extra/clangd/SemanticHighlighting.cpp clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp index 5d9336fa6e53d..d2d110b72011b 100644 --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -582,6 +582,18 @@ class CollectExtraHighlightings return true; } + bool VisitImportDecl(const ImportDecl *D) { + H.addToken(D->getLocation(), HighlightingKind::Modifier); + for (const auto ModuleLoc : D->getIdentifierLocs()) { + H.addToken(ModuleLoc, HighlightingKind::Namespace); + } + return true; + } + bool VisitExportDecl(const ExportDecl *D) { + H.addToken(D->getLocation(), HighlightingKind::Modifier); + return true; + } + bool VisitTagDecl(TagDecl *D) { for (TemplateParameterList *TPL : D->getTemplateParameterLists()) H.addAngleBracketTokens(TPL->getLAngleLoc(), TPL->getRAngleLoc()); diff --git a/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp b/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp index f163e248c383a..f10f3e4976cf9 100644 --- a/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp +++ b/clang-tools-extra/clangd/unittests/PrerequisiteModulesTest.cpp @@ -17,6 +17,7 @@ #include "ModulesBuilder.h" #include "Preamble.h" #include "ProjectModules.h" +#include "SemanticHighlighting.h" #include "TestTU.h" #include "support/Path.h" #include "support/ThreadsafeFS.h" @@ -575,7 +576,8 @@ int use() { return a; } ModulesBuilder Builder(CDB); - auto UseInfo = Builder.buildPrerequisiteModulesFor(getFullPath("Use.cpp"), FS); + auto UseInfo = + Builder.buildPrerequisiteModulesFor(getFullPath("Use.cpp"), FS); ASSERT_TRUE(UseInfo); HeaderSearchOptions HSOpts; @@ -1669,6 +1671,55 @@ void use() {} getFullPath("Consumer.cpp"), *NewCI)); } +TEST_F(PrerequisiteModulesTests, ModuleSemanticHighlighting) { + MockDirectoryCompilationDatabase CDB(TestDir, FS); + + llvm::StringRef AnnotatedCode = R"cpp( + module; + $import[[import]] M; + export module highlight; + $export[[export]] void foo() { + } +)cpp"; + Annotations UseCpp(AnnotatedCode); + + CDB.addFile("M.cppm", R"cpp( +export module M; +export struct TypeFromModule {}; +)cpp"); + + CDB.addFile("Use.cpp", UseCpp.code()); + + ModulesBuilder Builder(CDB); + + auto Inputs = getInputs("Use.cpp", CDB); + Inputs.ModulesManager = &Builder; + Inputs.Opts.SkipPreambleBuild = true; + + auto CI = buildCompilerInvocation(Inputs, DiagConsumer); + ASSERT_TRUE(CI); + + auto Preamble = + buildPreamble(getFullPath("Use.cpp"), *CI, Inputs, /*StoreInMemory=*/true, + /*PeambleCallback=*/nullptr); + ASSERT_TRUE(Preamble); + + auto AST = ParsedAST::build(getFullPath("Use.cpp"), Inputs, std::move(CI), {}, + Preamble); + + ASSERT_TRUE(AST); + + auto Actual = getSemanticHighlightings(AST.value(), + /*IncludeInactiveRegionTokens=*/true); + auto HasToken = [&](llvm::StringRef Name, HighlightingKind Kind) { + return llvm::any_of(Actual, [&](const HighlightingToken &T) { + return T.Kind == Kind && T.R == UseCpp.range(Name); + }); + }; + EXPECT_TRUE(HasToken("import", HighlightingKind::Modifier)); + EXPECT_TRUE(HasToken("export", HighlightingKind::Modifier)); +} + } // namespace } // namespace clang::clangd _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
