llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-modules

Author: Access (Decodetalkers)

<details>
<summary>Changes</summary>

This pr aims to add highlight for import and export keyword And induced new 
SemanticHighlight `keyword`

---

Patch is 48.61 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/204511.diff


11 Files Affected:

- (modified) clang-tools-extra/clangd/FindTarget.cpp (+12-1) 
- (modified) clang-tools-extra/clangd/SemanticHighlighting.cpp (+6-1) 
- (modified) clang-tools-extra/clangd/SemanticHighlighting.h (+1) 
- (modified) clang/include/clang/AST/Decl.h (+45-13) 
- (modified) clang/include/clang/Parse/Parser.h (+2-1) 
- (modified) clang/include/clang/Sema/Sema.h (+17-10) 
- (modified) clang/lib/AST/Decl.cpp (+36-34) 
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+7-4) 
- (modified) clang/lib/Parse/Parser.cpp (+43-36) 
- (modified) clang/lib/Sema/SemaLookup.cpp (+10-9) 
- (modified) clang/lib/Sema/SemaModule.cpp (+43-31) 


``````````diff
diff --git a/clang-tools-extra/clangd/FindTarget.cpp 
b/clang-tools-extra/clangd/FindTarget.cpp
index 41c9cddfebbbc..4ac77a884c70b 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -619,7 +619,18 @@ llvm::SmallVector<ReferenceLoc> refInDecl(const Decl *D,
                                   /*IsDecl=*/false,
                                   {D->getNominatedNamespaceAsWritten()}});
     }
-
+    void VisitImportDecl(const ImportDecl *D) {
+      Refs.push_back(ReferenceLoc{D->getQualifierLoc(),
+                                  D->getIdentLocation(),
+                                  /*IsDecl=*/true,
+                                  {D}});
+    }
+    void VisitExportDecl(const ExportDecl *D) {
+      Refs.push_back(ReferenceLoc{D->getQualifierLoc(),
+                                  D->getIdentLocation(),
+                                  /*IsDecl=*/true,
+                                  {D}});
+    }
     void VisitUsingDecl(const UsingDecl *D) {
       // "using ns::identifier;" is a non-declaration reference.
       Refs.push_back(ReferenceLoc{
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp 
b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index 856904bc810d1..5c331df5197bb 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -122,6 +122,8 @@ std::optional<HighlightingKind> kindForDecl(const NamedDecl 
*D,
                                 : HighlightingKind::Method;
   if (isa<FieldDecl, IndirectFieldDecl, ObjCPropertyDecl>(D))
     return HighlightingKind::Field;
+  if (isa<ImportDecl, ExportDecl>(D))
+    return HighlightingKind::Keyword;
   if (isa<EnumDecl>(D))
     return HighlightingKind::Enum;
   if (isa<EnumConstantDecl>(D))
@@ -176,7 +178,7 @@ std::optional<HighlightingKind> kindForType(const Type *TP,
 }
 
 bool isDependent(const Decl *D) {
-  if (isa<UnresolvedUsingValueDecl>(D))
+  if (isa<UnresolvedUsingValueDecl, ImportDecl>(D))
     return true;
   return false;
 }
@@ -1244,6 +1246,7 @@ bool operator<(const HighlightingToken &L, const 
HighlightingToken &R) {
          std::tie(R.R, R.Kind, R.Modifiers);
 }
 
+// FIXME: import module
 std::vector<SemanticToken>
 toSemanticTokens(llvm::ArrayRef<HighlightingToken> Tokens,
                  llvm::StringRef Code) {
@@ -1323,6 +1326,8 @@ llvm::StringRef toSemanticTokenType(HighlightingKind 
Kind) {
     return "function";
   case HighlightingKind::Method:
     return "method";
+  case HighlightingKind::Keyword:
+    return "keyword";
   case HighlightingKind::StaticMethod:
     // FIXME: better method with static modifier?
     return "function";
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.h 
b/clang-tools-extra/clangd/SemanticHighlighting.h
index 59d742b83ee52..3b1c12418becb 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.h
+++ b/clang-tools-extra/clangd/SemanticHighlighting.h
@@ -34,6 +34,7 @@ enum class HighlightingKind {
   Parameter,
   Function,
   Method,
+  Keyword,
   StaticMethod,
   Field,
   StaticField,
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index e3f513732e588..46635bc1b86a1 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -5055,7 +5055,7 @@ class CapturedDecl final
 ///
 /// Import declarations can also be implicitly generated from
 /// \#include/\#import directives.
-class ImportDecl final : public Decl,
+class ImportDecl final : public NamedDecl,
                          llvm::TrailingObjects<ImportDecl, SourceLocation> {
   friend class ASTContext;
   friend class ASTDeclReader;
@@ -5065,6 +5065,7 @@ class ImportDecl final : public Decl,
   /// The imported module.
   Module *ImportedModule = nullptr;
 
+  NestedNameSpecifierLoc QualifierLoc;
   /// The next import in the list of imports local to the translation
   /// unit being parsed (not loaded from an AST file).
   ///
@@ -5076,12 +5077,15 @@ class ImportDecl final : public Decl,
   llvm::PointerIntPair<ImportDecl *, 1, bool> NextLocalImportAndComplete;
 
   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
+             NestedNameSpecifierLoc QualifierLoc, IdentifierInfo *Id,
              ArrayRef<SourceLocation> IdentifierLocs);
 
   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
+             NestedNameSpecifierLoc QualifierLoc, DeclarationName Id,
              SourceLocation EndLoc);
 
-  ImportDecl(EmptyShell Empty) : Decl(Import, Empty) {}
+  ImportDecl(EmptyShell Empty)
+      : NamedDecl(Import, nullptr, SourceLocation(), DeclarationName()) {}
 
   bool isImportComplete() const { return NextLocalImportAndComplete.getInt(); }
 
@@ -5100,14 +5104,17 @@ class ImportDecl final : public Decl,
 public:
   /// Create a new module import declaration.
   static ImportDecl *Create(ASTContext &C, DeclContext *DC,
+                            NestedNameSpecifierLoc QualifierLoc,
                             SourceLocation StartLoc, Module *Imported,
+                            IdentifierInfo *Id,
                             ArrayRef<SourceLocation> IdentifierLocs);
 
   /// Create a new module import declaration for an implicitly-generated
   /// import.
   static ImportDecl *CreateImplicit(ASTContext &C, DeclContext *DC,
                                     SourceLocation StartLoc, Module *Imported,
-                                    SourceLocation EndLoc);
+                                    NestedNameSpecifierLoc QualifierLoc,
+                                    DeclarationName Id, SourceLocation EndLoc);
 
   /// Create a new, deserialized module import declaration.
   static ImportDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID,
@@ -5116,6 +5123,18 @@ class ImportDecl final : public Decl,
   /// Retrieve the module that was imported by the import declaration.
   Module *getImportedModule() const { return ImportedModule; }
 
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace, with source-location information.
+  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
+
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace.
+  NestedNameSpecifier getQualifier() const {
+    return QualifierLoc.getNestedNameSpecifier();
+  }
+
+  SourceLocation getIdentLocation() const { return getLocation(); }
+
   /// Retrieves the locations of each of the identifiers that make up
   /// the complete module name in the import declaration.
   ///
@@ -5135,22 +5154,26 @@ class ImportDecl final : public Decl,
 /// \code
 ///   export void foo();
 /// \endcode
-class ExportDecl final : public Decl, public DeclContext {
-  LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION();
+class ExportDecl final : public NamedDecl, public DeclContext {
+  void anchor() override;
 
 private:
   friend class ASTDeclReader;
 
   /// The source location for the right brace (if valid).
   SourceLocation RBraceLoc;
+  NestedNameSpecifierLoc QualifierLoc;
 
-  ExportDecl(DeclContext *DC, SourceLocation ExportLoc)
-      : Decl(Export, DC, ExportLoc), DeclContext(Export),
-        RBraceLoc(SourceLocation()) {}
+  ExportDecl(DeclContext *DC, SourceLocation ExportLoc, NestedNameSpecifierLoc 
QualifierLoc, DeclarationName Id)
+      : NamedDecl(Export, DC, ExportLoc, Id), DeclContext(Export),
+        RBraceLoc(SourceLocation()),
+        QualifierLoc(QualifierLoc){}
 
 public:
   static ExportDecl *Create(ASTContext &C, DeclContext *DC,
-                            SourceLocation ExportLoc);
+                            SourceLocation ExportLoc,
+                            NestedNameSpecifierLoc QualifierLoc,
+                            DeclarationName Id);
   static ExportDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
 
   SourceLocation getExportLoc() const { return getLocation(); }
@@ -5170,14 +5193,24 @@ class ExportDecl final : public Decl, public 
DeclContext {
   SourceRange getSourceRange() const override LLVM_READONLY {
     return SourceRange(getLocation(), getEndLoc());
   }
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace, with source-location information.
+  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
+
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace.
+  NestedNameSpecifier getQualifier() const {
+    return QualifierLoc.getNestedNameSpecifier();
+  }
 
+  SourceLocation getIdentLocation() const { return getLocation(); }
   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   static bool classofKind(Kind K) { return K == Export; }
   static DeclContext *castToDeclContext(const ExportDecl *D) {
-    return static_cast<DeclContext *>(const_cast<ExportDecl*>(D));
+    return static_cast<DeclContext *>(const_cast<ExportDecl *>(D));
   }
   static ExportDecl *castFromDeclContext(const DeclContext *DC) {
-    return static_cast<ExportDecl *>(const_cast<DeclContext*>(DC));
+    return static_cast<ExportDecl *>(const_cast<DeclContext *>(DC));
   }
 };
 
@@ -5188,8 +5221,7 @@ class EmptyDecl : public Decl {
   virtual void anchor();
 
 public:
-  static EmptyDecl *Create(ASTContext &C, DeclContext *DC,
-                           SourceLocation L);
+  static EmptyDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L);
   static EmptyDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
 
   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
diff --git a/clang/include/clang/Parse/Parser.h 
b/clang/include/clang/Parse/Parser.h
index 5e7af97feeb6c..04d39642d6c23 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -7656,7 +7656,8 @@ class Parser : public CodeCompletionHandler {
   ///
   ///   exception-declaration:
   ///     attribute-specifier-seq[opt] type-specifier-seq declarator
-  ///     attribute-specifier-seq[opt] type-specifier-seq 
abstract-declarator[opt]
+  ///     attribute-specifier-seq[opt] type-specifier-seq
+  ///     abstract-declarator[opt]
   ///     '...'
   /// \endverbatim
   ///
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index ff474fdd99562..89c75b6fdebfc 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -9985,10 +9985,11 @@ class Sema final : public SemaBase {
 
   /// The parser has processed a module-declaration that begins the definition
   /// of a module interface or implementation.
-  DeclGroupPtrTy ActOnModuleDecl(SourceLocation StartLoc,
+  DeclGroupPtrTy ActOnModuleDecl(CXXScopeSpec *SS, SourceLocation StartLoc,
                                  SourceLocation ModuleLoc, ModuleDeclKind MDK,
                                  ModuleIdPath Path, ModuleIdPath Partition,
                                  ModuleImportState &ImportState,
+                                 IdentifierInfo *Id,
                                  bool SeenNoTrivialPPDirective);
 
   /// The parser has processed a global-module-fragment declaration that begins
@@ -10011,24 +10012,27 @@ class Sema final : public SemaBase {
   /// \param ImportLoc The location of the 'import' keyword.
   /// \param Path The module toplevel name as an access path.
   /// \param IsPartition If the name is for a partition.
-  DeclResult ActOnModuleImport(SourceLocation StartLoc,
+  DeclResult ActOnModuleImport(CXXScopeSpec *SS, SourceLocation StartLoc,
                                SourceLocation ExportLoc,
                                SourceLocation ImportLoc, ModuleIdPath Path,
-                               bool IsPartition = false);
-  DeclResult ActOnModuleImport(SourceLocation StartLoc,
+                               IdentifierInfo *Id, bool IsPartition = false);
+  DeclResult ActOnModuleImport(CXXScopeSpec *SS, SourceLocation StartLoc,
                                SourceLocation ExportLoc,
                                SourceLocation ImportLoc, Module *M,
-                               ModuleIdPath Path = {});
+                               IdentifierInfo *Id, ModuleIdPath Path = {});
 
   /// The parser has processed a module import translated from a
   /// #include or similar preprocessing directive.
-  void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
-  void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
+  void ActOnAnnotModuleInclude(CXXScopeSpec *SS, SourceLocation DirectiveLoc,
+                               IdentifierInfo *Id, Module *Mod);
+  void BuildModuleInclude(CXXScopeSpec *SS, SourceLocation DirectiveLoc,
+                          IdentifierInfo *Id, Module *Mod);
 
   /// The parsed has entered a submodule.
   void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
   /// The parser has left a submodule.
-  void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
+  void ActOnAnnotModuleEnd(CXXScopeSpec *SS, SourceLocation DirectiveLoc,
+                           IdentifierInfo *Id, Module *Mod);
 
   /// Create an implicit import of the given module at the given
   /// source location, for error recovery, if possible.
@@ -10036,12 +10040,15 @@ class Sema final : public SemaBase {
   /// This routine is typically used when an entity found by name lookup
   /// is actually hidden within a module that we know about but the user
   /// has forgotten to import.
-  void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
+  void createImplicitModuleImportForErrorRecovery(CXXScopeSpec *SS,
+                                                  SourceLocation Loc,
+                                                  DeclarationName Id,
                                                   Module *Mod);
 
   /// We have parsed the start of an export declaration, including the '{'
   /// (if present).
-  Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
+  Decl *ActOnStartExportDecl(Scope *S, CXXScopeSpec *SS,
+                             SourceLocation ExportLoc, IdentifierInfo *Id,
                              SourceLocation LBraceLoc);
 
   /// Complete the definition of an export declaration.
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index a6de9959e0f62..fbab744624692 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -394,8 +394,7 @@ void LinkageComputer::mergeTemplateLV(
     LinkageInfo &LV, const FunctionDecl *fn,
     const FunctionTemplateSpecializationInfo *specInfo,
     LVComputationKind computation) {
-  bool considerVisibility =
-    shouldConsiderTemplateVisibility(fn, specInfo);
+  bool considerVisibility = shouldConsiderTemplateVisibility(fn, specInfo);
 
   FunctionTemplateDecl *temp = specInfo->getTemplate();
   // Merge information from the template declaration.
@@ -705,10 +704,10 @@ LinkageComputer::getLVForNamespaceScopeDecl(const 
NamedDecl *D,
       // If we're declared in a namespace with a visibility attribute,
       // use that namespace's visibility, and it still counts as explicit.
       for (const DeclContext *DC = D->getDeclContext();
-           !isa<TranslationUnitDecl>(DC);
-           DC = DC->getParent()) {
+           !isa<TranslationUnitDecl>(DC); DC = DC->getParent()) {
         const auto *ND = dyn_cast<NamespaceDecl>(DC);
-        if (!ND) continue;
+        if (!ND)
+          continue;
         if (std::optional<Visibility> Vis =
                 getExplicitVisibility(ND, computation)) {
           LV.mergeVisibility(*Vis, true);
@@ -962,7 +961,6 @@ LinkageComputer::getLVForClassMember(const NamedDecl *D,
   if (!isExternallyVisible(classLV.getLinkage()))
     return classLV;
 
-
   // Otherwise, don't merge in classLV yet, because in certain cases
   // we need to completely ignore the visibility from it.
 
@@ -2178,7 +2176,7 @@ SourceRange VarDecl::getSourceRange() const {
   return DeclaratorDecl::getSourceRange();
 }
 
-template<typename T>
+template <typename T>
 static LanguageLinkage getDeclLanguageLinkage(const T &D) {
   // C++ [dcl.link]p1: All function types, function names with external 
linkage,
   // and variable names with external linkage have a language linkage.
@@ -2205,8 +2203,7 @@ static LanguageLinkage getDeclLanguageLinkage(const T &D) 
{
   return CXXLanguageLinkage;
 }
 
-template<typename T>
-static bool isDeclExternC(const T &D) {
+template <typename T> static bool isDeclExternC(const T &D) {
   // Since the context is ignored for class members, they can only have C++
   // language linkage or no language linkage.
   const DeclContext *DC = D.getDeclContext();
@@ -2863,8 +2860,8 @@ MemberSpecializationInfo 
*VarDecl::getMemberSpecializationInfo() const {
   return nullptr;
 }
 
-void VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK,
-                                         SourceLocation PointOfInstantiation) {
+void VarDecl::setTemplateSpecializationKind(
+    TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation) {
   assert((isa<VarTemplateSpecializationDecl>(this) ||
           getMemberSpecializationInfo()) &&
          "not a variable or static data member template specialization");
@@ -2872,8 +2869,7 @@ void 
VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK,
   if (VarTemplateSpecializationDecl *Spec =
           dyn_cast<VarTemplateSpecializationDecl>(this)) {
     Spec->setSpecializationKind(TSK);
-    if (TSK != TSK_ExplicitSpecialization &&
-        PointOfInstantiation.isValid() &&
+    if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() &&
         Spec->getPointOfInstantiation().isInvalid()) {
       Spec->setPointOfInstantiation(PointOfInstantiation);
       if (ASTMutationListener *L = getASTContext().getASTMutationListener())
@@ -2934,8 +2930,8 @@ ParmVarDecl *ParmVarDecl::Create(ASTContext &C, 
DeclContext *DC,
                                  const IdentifierInfo *Id, QualType T,
                                  TypeSourceInfo *TInfo, StorageClass S,
                                  Expr *DefArg) {
-  return new (C, DC) ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo,
-                                 S, DefArg);
+  return new (C, DC)
+      ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo, S, DefArg);
 }
 
 QualType ParmVarDecl::getOriginalType() const {
@@ -3590,9 +3586,7 @@ LanguageLinkage FunctionDecl::getLanguageLinkage() const {
   return getDeclLanguageLinkage(*this);
 }
 
-bool FunctionDecl::isExternC() const {
-  return isDeclExternC(*this);
-}
+bool FunctionDecl::isExternC() const { return isDeclExternC(*this); }
 
 bool FunctionDecl::isInExternCContext() const {
   if (DeviceKernelAttr::isOpenCLSpelling(getAttr<DeviceKernelAttr>()))
@@ -3611,8 +3605,7 @@ bool FunctionDecl::isGlobal() const {
   if (getCanonicalDecl()->getStorageClass() == SC_Static)
     return false;
 
-  for (const DeclContext *DC = getDeclContext();
-       DC->isNamespace();
+  for (const DeclContext *DC = getDeclContext(); DC->isNamespace();
        DC = DC->getParent()) {
     if (const auto *Namespace = cast<NamespaceDecl>(DC)) {
       if (!Namespace->getDeclName())
@@ -3810,7 +3803,7 @@ void FunctionDecl::setParams(ASTContext &C,
 
   // Zero params -> null pointer.
   if (!NewParamInfo.empty()) {
-    ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()];
+    ParamInfo = new (C) ParmVarDecl *[NewParamInfo.size()];
     llvm::copy(NewParamInfo, ParamInfo);
   }
 }
@@ -4929,7 +4922,7 @@ void TagDecl::startDefinition() {
 
   if (auto *D = dyn_cast<CXXRecordDecl>(this)) {
     struct CXXRecordDecl::DefinitionData *Data =
-      new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
+        new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
     for (auto *I : redecls())
       cast<CXXRecordDecl>(I)->DefinitionData = Data;
   }
@@ -5470,7 +5463,7 @@ void BlockDecl::setParams(ArrayRef<ParmVarDecl *> 
NewParamInfo) {
   // Zero params -> null pointer.
   if (!NewParamInfo.empty()) {
     NumParams = NewParamInfo.size();
-    ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()];
+    ParamInfo = new (getASTContext()) ParmVarDecl *[NewParamInfo.size()];
     llvm::copy(NewParamInfo, ParamInfo);
   }
 }
@@ -6053,36 +6046,42 @@ static unsigned getNumModuleIdentifiers(Module *Mod) {
 }
 
 ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
-                       Module *Imported,
+                 ...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/204511
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to