@@ -413,6 +413,37 @@ class ResultBuilder {
413413 bool IsImpossibleToSatisfy (const NamedDecl *ND) const ;
414414 // @}
415415};
416+
417+ void AddFunctionTypeQuals (CodeCompletionBuilder &Result,
418+ const Qualifiers Quals) {
419+ // FIXME: Add ref-qualifier!
420+
421+ // Handle single qualifiers without copying
422+ if (Quals.hasOnlyConst ()) {
423+ Result.AddInformativeChunk (" const" );
424+ return ;
425+ }
426+
427+ if (Quals.hasOnlyVolatile ()) {
428+ Result.AddInformativeChunk (" volatile" );
429+ return ;
430+ }
431+
432+ if (Quals.hasOnlyRestrict ()) {
433+ Result.AddInformativeChunk (" restrict" );
434+ return ;
435+ }
436+
437+ // Handle multiple qualifiers.
438+ std::string QualsStr;
439+ if (Quals.hasConst ())
440+ QualsStr += " const" ;
441+ if (Quals.hasVolatile ())
442+ QualsStr += " volatile" ;
443+ if (Quals.hasRestrict ())
444+ QualsStr += " restrict" ;
445+ Result.AddInformativeChunk (Result.getAllocator ().CopyString (QualsStr));
446+ }
416447} // namespace
417448
418449void PreferredTypeBuilder::enterReturn (Sema &S, SourceLocation Tok) {
@@ -1436,7 +1467,7 @@ void ResultBuilder::AddResult(Result R, DeclContext *CurContext,
14361467 AdjustResultPriorityForDecl (R);
14371468
14381469 // Account for explicit object parameter
1439- const auto getQualifiers = [&](const CXXMethodDecl *MethodDecl) {
1470+ const auto GetQualifiers = [&](const CXXMethodDecl *MethodDecl) {
14401471 if (MethodDecl->isExplicitObjectMemberFunction ())
14411472 return MethodDecl->getFunctionObjectParameterType ().getQualifiers ();
14421473 else
@@ -1455,7 +1486,7 @@ void ResultBuilder::AddResult(Result R, DeclContext *CurContext,
14551486 if (HasObjectTypeQualifiers)
14561487 if (const auto *Method = dyn_cast<CXXMethodDecl>(R.Declaration ))
14571488 if (Method->isInstance ()) {
1458- Qualifiers MethodQuals = getQualifiers (Method);
1489+ Qualifiers MethodQuals = GetQualifiers (Method);
14591490 if (ObjectTypeQualifiers == MethodQuals)
14601491 R.Priority += CCD_ObjectQualifierMatch;
14611492 else if (ObjectTypeQualifiers - MethodQuals) {
@@ -3438,19 +3469,15 @@ static void AddQualifierToCompletionString(CodeCompletionBuilder &Result,
34383469// object
34393470static void AddCXXExplicitObjectFunctionTypeQualsToCompletionString (
34403471 CodeCompletionBuilder &Result, const CXXMethodDecl *Function) {
3441- const auto Quals = Function->getFunctionObjectParameterType ();
3472+ assert (isa<CXXMethodDecl>(Function) &&
3473+ Function->hasCXXExplicitFunctionObjectParameter () &&
3474+ " Valid only on CXX explicit object methods" );
34423475
3476+ const auto Quals = Function->getFunctionObjectParameterType ();
34433477 if (!Quals.hasQualifiers ())
34443478 return ;
34453479
3446- std::string QualsStr;
3447- if (Quals.getQualifiers ().hasConst ())
3448- QualsStr += " const" ;
3449- if (Quals.getQualifiers ().hasVolatile ())
3450- QualsStr += " volatile" ;
3451- if (Quals.getQualifiers ().hasRestrict ())
3452- QualsStr += " restrict" ;
3453- Result.AddInformativeChunk (Result.getAllocator ().CopyString (QualsStr));
3480+ AddFunctionTypeQuals (Result, Quals.getQualifiers ());
34543481}
34553482
34563483static void
@@ -3461,40 +3488,13 @@ AddFunctionTypeQualsToCompletionString(CodeCompletionBuilder &Result,
34613488 // if explicit object method, infer quals from the object parameter
34623489 AddCXXExplicitObjectFunctionTypeQualsToCompletionString (Result,
34633490 CxxMethodDecl);
3464- return ;
3465- }
3466-
3467- const auto *Proto = Function->getType ()->getAs <FunctionProtoType>();
3468- if (!Proto || !Proto->getMethodQuals ())
3469- return ;
3470-
3471- // FIXME: Add ref-qualifier!
3472-
3473- // Handle single qualifiers without copying
3474- if (Proto->getMethodQuals ().hasOnlyConst ()) {
3475- Result.AddInformativeChunk (" const" );
3476- return ;
3477- }
3478-
3479- if (Proto->getMethodQuals ().hasOnlyVolatile ()) {
3480- Result.AddInformativeChunk (" volatile" );
3481- return ;
3482- }
3491+ } else {
3492+ const auto *Proto = Function->getType ()->getAs <FunctionProtoType>();
3493+ if (!Proto || !Proto->getMethodQuals ())
3494+ return ;
34833495
3484- if (Proto->getMethodQuals ().hasOnlyRestrict ()) {
3485- Result.AddInformativeChunk (" restrict" );
3486- return ;
3496+ AddFunctionTypeQuals (Result, Proto->getMethodQuals ());
34873497 }
3488-
3489- // Handle multiple qualifiers.
3490- std::string QualsStr;
3491- if (Proto->isConst ())
3492- QualsStr += " const" ;
3493- if (Proto->isVolatile ())
3494- QualsStr += " volatile" ;
3495- if (Proto->isRestrict ())
3496- QualsStr += " restrict" ;
3497- Result.AddInformativeChunk (Result.getAllocator ().CopyString (QualsStr));
34983498}
34993499
35003500static void
0 commit comments