Unverified Commit 1fbb1d6d authored by Kadir Cetinkaya's avatar Kadir Cetinkaya
Browse files

[clangd] Drop returntype/type when hovering over type-ish names

Summary:
Some names, e.g. constructor/destructor/conversions, already contain
the type info, no need to duplicate them in the hoverinfo.

Fixes https://github.com/clangd/clangd/issues/252

Reviewers: sammccall, ilya-biryukov

Subscribers: MaskRay, jkorous, arphaman, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D73110
parent 1256d680
Loading
Loading
Loading
Loading
+12 −13
Original line number Diff line number Diff line
@@ -266,20 +266,19 @@ void fillFunctionTypeAndParams(HoverInfo &HI, const Decl *D,
    }
  }

  if (const auto *CCD = llvm::dyn_cast<CXXConstructorDecl>(FD)) {
    // Constructor's "return type" is the class type.
    HI.ReturnType = declaredType(CCD->getParent()).getAsString(Policy);
    // Don't provide any type for the constructor itself.
  } else if (llvm::isa<CXXDestructorDecl>(FD)) {
    HI.ReturnType = "void";
  } else {
    HI.ReturnType = printType(FD->getReturnType(), Policy);
  // We don't want any type info, if name already contains it. This is true for
  // constructors/destructors and conversion operators.
  const auto NK = FD->getDeclName().getNameKind();
  if (NK == DeclarationName::CXXConstructorName ||
      NK == DeclarationName::CXXDestructorName ||
      NK == DeclarationName::CXXConversionFunctionName)
    return;

  HI.ReturnType = printType(FD->getReturnType(), Policy);
  QualType QT = FD->getType();
  if (const VarDecl *VD = llvm::dyn_cast<VarDecl>(D)) // Lambdas
    QT = VD->getType().getDesugaredType(D->getASTContext());
  HI.Type = printType(QT, Policy);
  }
  // FIXME: handle variadics.
}

+9 −2
Original line number Diff line number Diff line
@@ -327,7 +327,6 @@ class Foo {})cpp";
         HI.Name = "X";
         HI.LocalScope = "X<T *>::"; // FIXME: X<T *, void>::
         HI.Kind = index::SymbolKind::Constructor;
         HI.ReturnType = "X<T *>";
         HI.Definition = "X()";
         HI.Parameters.emplace();
       }},
@@ -337,10 +336,18 @@ class Foo {})cpp";
         HI.Name = "~X";
         HI.LocalScope = "X::";
         HI.Kind = index::SymbolKind::Destructor;
         HI.ReturnType = "void";
         HI.Definition = "~X()";
         HI.Parameters.emplace();
       }},
      {"class X { operator [[in^t]](); };",
       [](HoverInfo &HI) {
         HI.NamespaceScope = "";
         HI.Name = "operator int";
         HI.LocalScope = "X::";
         HI.Kind = index::SymbolKind::ConversionFunction;
         HI.Definition = "operator int()";
         HI.Parameters.emplace();
       }},

      // auto on lambda
      {R"cpp(