yvvan updated this revision to Diff 100705.
yvvan edited the summary of this revision.
yvvan added a comment.

Support for non-simple types. Drop results with macros.


https://reviews.llvm.org/D33644

Files:
  lib/Sema/SemaCodeComplete.cpp


Index: lib/Sema/SemaCodeComplete.cpp
===================================================================
--- lib/Sema/SemaCodeComplete.cpp
+++ lib/Sema/SemaCodeComplete.cpp
@@ -2279,6 +2279,15 @@
     } else {
       Type.getAsStringInternal(Result, Policy);
     }
+    if (Param->hasDefaultArg()) {
+      APValue *defaultValue = Param->evaluateValue();
+      if (defaultValue) {
+        std::string defaultValueStr = defaultValue->getAsString(
+                    Param->getASTContext(), Param->getType());
+        if (!defaultValueStr.empty())
+          Result += " = " + defaultValueStr;
+      }
+    }
     return Result;
   }
 
@@ -2395,6 +2404,19 @@
   return Result;
 }
 
+static std::string GetDefaultValueString(const ParmVarDecl *Param,
+                                         const SourceManager &SM,
+                                         const LangOptions &LangOpts) {
+  const SourceRange SrcRange = Param->getDefaultArg()->getSourceRange();
+  const SourceLocation StartLoc = SrcRange.getBegin();
+  const SourceLocation EndLoc = SrcRange.getEnd();
+  if (StartLoc != SM.getExpansionLoc(StartLoc) || EndLoc != 
SM.getExpansionLoc(EndLoc))
+      return "";
+  const size_t PtrDiff = EndLoc.getRawEncoding() - StartLoc.getRawEncoding()
+          + Lexer::MeasureTokenLength(EndLoc, SM, LangOpts);
+  return std::string{SM.getCharacterData(StartLoc), PtrDiff};
+}
+
 /// \brief Add function parameter chunks to the given code completion string.
 static void AddFunctionParameterChunks(Preprocessor &PP,
                                        const PrintingPolicy &Policy,
@@ -2423,11 +2445,17 @@
       FirstParameter = false;
     else
       Result.AddChunk(CodeCompletionString::CK_Comma);
-    
+
     InOptional = false;
     
     // Format the placeholder string.
     std::string PlaceholderStr = FormatFunctionParameter(Policy, Param);
+    if (Param->hasDefaultArg() && PlaceholderStr.find("=") == 
std::string::npos) {
+        std::string DefaultValue =
+                GetDefaultValueString(Param, PP.getSourceManager(), 
PP.getLangOpts());
+        if (!DefaultValue.empty())
+            PlaceholderStr += DefaultValue;
+    }
 
     if (Function->isVariadic() && P == N - 1)
       PlaceholderStr += ", ...";
@@ -3009,10 +3037,18 @@
 
     // Format the placeholder string.
     std::string Placeholder;
-    if (Function)
-      Placeholder = FormatFunctionParameter(Policy, Function->getParamDecl(P));
-    else
+    if (Function) {
+      const ParmVarDecl *Param = Function->getParamDecl(P);
+      Placeholder = FormatFunctionParameter(Policy, Param);
+      if (Param->hasDefaultArg() && Placeholder.find("=") == 
std::string::npos) {
+        std::string DefaultValue =
+                GetDefaultValueString(Param, Context.getSourceManager(), 
Context.getLangOpts());
+        if (!DefaultValue.empty())
+          Placeholder += DefaultValue;
+      }
+     } else {
       Placeholder = Prototype->getParamType(P).getAsString(Policy);
+    }
 
     if (P == CurrentArg)
       Result.AddCurrentParameterChunk(


Index: lib/Sema/SemaCodeComplete.cpp
===================================================================
--- lib/Sema/SemaCodeComplete.cpp
+++ lib/Sema/SemaCodeComplete.cpp
@@ -2279,6 +2279,15 @@
     } else {
       Type.getAsStringInternal(Result, Policy);
     }
+    if (Param->hasDefaultArg()) {
+      APValue *defaultValue = Param->evaluateValue();
+      if (defaultValue) {
+        std::string defaultValueStr = defaultValue->getAsString(
+                    Param->getASTContext(), Param->getType());
+        if (!defaultValueStr.empty())
+          Result += " = " + defaultValueStr;
+      }
+    }
     return Result;
   }
 
@@ -2395,6 +2404,19 @@
   return Result;
 }
 
+static std::string GetDefaultValueString(const ParmVarDecl *Param,
+                                         const SourceManager &SM,
+                                         const LangOptions &LangOpts) {
+  const SourceRange SrcRange = Param->getDefaultArg()->getSourceRange();
+  const SourceLocation StartLoc = SrcRange.getBegin();
+  const SourceLocation EndLoc = SrcRange.getEnd();
+  if (StartLoc != SM.getExpansionLoc(StartLoc) || EndLoc != SM.getExpansionLoc(EndLoc))
+      return "";
+  const size_t PtrDiff = EndLoc.getRawEncoding() - StartLoc.getRawEncoding()
+          + Lexer::MeasureTokenLength(EndLoc, SM, LangOpts);
+  return std::string{SM.getCharacterData(StartLoc), PtrDiff};
+}
+
 /// \brief Add function parameter chunks to the given code completion string.
 static void AddFunctionParameterChunks(Preprocessor &PP,
                                        const PrintingPolicy &Policy,
@@ -2423,11 +2445,17 @@
       FirstParameter = false;
     else
       Result.AddChunk(CodeCompletionString::CK_Comma);
-    
+
     InOptional = false;
     
     // Format the placeholder string.
     std::string PlaceholderStr = FormatFunctionParameter(Policy, Param);
+    if (Param->hasDefaultArg() && PlaceholderStr.find("=") == std::string::npos) {
+        std::string DefaultValue =
+                GetDefaultValueString(Param, PP.getSourceManager(), PP.getLangOpts());
+        if (!DefaultValue.empty())
+            PlaceholderStr += DefaultValue;
+    }
 
     if (Function->isVariadic() && P == N - 1)
       PlaceholderStr += ", ...";
@@ -3009,10 +3037,18 @@
 
     // Format the placeholder string.
     std::string Placeholder;
-    if (Function)
-      Placeholder = FormatFunctionParameter(Policy, Function->getParamDecl(P));
-    else
+    if (Function) {
+      const ParmVarDecl *Param = Function->getParamDecl(P);
+      Placeholder = FormatFunctionParameter(Policy, Param);
+      if (Param->hasDefaultArg() && Placeholder.find("=") == std::string::npos) {
+        std::string DefaultValue =
+                GetDefaultValueString(Param, Context.getSourceManager(), Context.getLangOpts());
+        if (!DefaultValue.empty())
+          Placeholder += DefaultValue;
+      }
+     } else {
       Placeholder = Prototype->getParamType(P).getAsString(Policy);
+    }
 
     if (P == CurrentArg)
       Result.AddCurrentParameterChunk(
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to