@@ -1345,13 +1345,17 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
13451345
13461346 case CodeCompletionResult::ResultKind::Keyword:
13471347 return new (*Sink.Allocator )
1348- CodeCompletionResult (KeywordKind, SemanticContext, NumBytesToErase,
1349- CCS, ExpectedTypeRelation);
1348+ CodeCompletionResult (
1349+ KeywordKind, SemanticContext, NumBytesToErase,
1350+ CCS, ExpectedTypeRelation,
1351+ copyString (*Sink.Allocator , BriefDocComment));
13501352
13511353 case CodeCompletionResult::ResultKind::BuiltinOperator:
13521354 case CodeCompletionResult::ResultKind::Pattern:
13531355 return new (*Sink.Allocator ) CodeCompletionResult (
1354- Kind, SemanticContext, NumBytesToErase, CCS, ExpectedTypeRelation);
1356+ Kind, SemanticContext, NumBytesToErase, CCS, ExpectedTypeRelation,
1357+ CodeCompletionOperatorKind::None,
1358+ copyString (*Sink.Allocator , BriefDocComment));
13551359
13561360 case CodeCompletionResult::ResultKind::Literal:
13571361 assert (LiteralKind.hasValue ());
@@ -5136,6 +5140,100 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
51365140 }
51375141 }
51385142
5143+ static StringRef getFunctionBuilderDocComment (
5144+ FunctionBuilderBuildFunction function) {
5145+ switch (function) {
5146+ case FunctionBuilderBuildFunction::BuildArray:
5147+ return " Enables support for..in loops in a function builder by "
5148+ " combining the results of all iterations into a single result" ;
5149+
5150+ case FunctionBuilderBuildFunction::BuildBlock:
5151+ return " Required by every function builder to build combined results "
5152+ " from statement blocks" ;
5153+
5154+ case FunctionBuilderBuildFunction::BuildEitherFirst:
5155+ return " With buildEither(second:), enables support for 'if-else' and "
5156+ " 'switch' statements by folding conditional results into a single "
5157+ " result" ;
5158+
5159+ case FunctionBuilderBuildFunction::BuildEitherSecond:
5160+ return " With buildEither(first:), enables support for 'if-else' and "
5161+ " 'switch' statements by folding conditional results into a single "
5162+ " result" ;
5163+
5164+ case FunctionBuilderBuildFunction::BuildExpression:
5165+ return " If declared, provides contextual type information for statement "
5166+ " expressions to translate them into partial results" ;
5167+
5168+ case FunctionBuilderBuildFunction::BuildFinalResult:
5169+ return " If declared, this will be called on the partial result from the "
5170+ " outermost block statement to produce the final returned result" ;
5171+
5172+ case FunctionBuilderBuildFunction::BuildLimitedAvailability:
5173+ return " If declared, this will be called on the partial result of "
5174+ " an 'if #available' block to allow the function builder to erase "
5175+ " type information" ;
5176+
5177+ case FunctionBuilderBuildFunction::BuildOptional:
5178+ return " Enables support for `if` statements that do not have an `else`" ;
5179+ }
5180+ }
5181+
5182+ void addFunctionBuilderBuildCompletion (
5183+ NominalTypeDecl *builder, Type componentType,
5184+ FunctionBuilderBuildFunction function) {
5185+ CodeCompletionResultBuilder Builder (
5186+ Sink,
5187+ CodeCompletionResult::ResultKind::Pattern,
5188+ SemanticContextKind::CurrentNominal, {});
5189+ Builder.setExpectedTypeRelation (
5190+ CodeCompletionResult::ExpectedTypeRelation::NotApplicable);
5191+
5192+ if (!hasFuncIntroducer) {
5193+ if (!hasAccessModifier &&
5194+ builder->getFormalAccess () >= AccessLevel::Public)
5195+ Builder.addAccessControlKeyword (AccessLevel::Public);
5196+
5197+ if (!hasStaticOrClass)
5198+ Builder.addTextChunk (" static " );
5199+
5200+ Builder.addTextChunk (" func " );
5201+ }
5202+
5203+ std::string declStringWithoutFunc;
5204+ {
5205+ llvm::raw_string_ostream out (declStringWithoutFunc);
5206+ printFunctionBuilderBuildFunction (
5207+ builder, componentType, function, None, out);
5208+ }
5209+ Builder.addTextChunk (declStringWithoutFunc);
5210+ Builder.addBraceStmtWithCursor ();
5211+ Builder.setBriefDocComment (getFunctionBuilderDocComment (function));
5212+ }
5213+
5214+ // / Add completions for the various "build" functions in a function builder.
5215+ void addFunctionBuilderBuildCompletions (NominalTypeDecl *builder) {
5216+ Type componentType = inferFunctionBuilderComponentType (builder);
5217+
5218+ addFunctionBuilderBuildCompletion (
5219+ builder, componentType, FunctionBuilderBuildFunction::BuildBlock);
5220+ addFunctionBuilderBuildCompletion (
5221+ builder, componentType, FunctionBuilderBuildFunction::BuildExpression);
5222+ addFunctionBuilderBuildCompletion (
5223+ builder, componentType, FunctionBuilderBuildFunction::BuildOptional);
5224+ addFunctionBuilderBuildCompletion (
5225+ builder, componentType, FunctionBuilderBuildFunction::BuildEitherFirst);
5226+ addFunctionBuilderBuildCompletion (
5227+ builder, componentType, FunctionBuilderBuildFunction::BuildEitherSecond);
5228+ addFunctionBuilderBuildCompletion (
5229+ builder, componentType, FunctionBuilderBuildFunction::BuildArray);
5230+ addFunctionBuilderBuildCompletion (
5231+ builder, componentType,
5232+ FunctionBuilderBuildFunction::BuildLimitedAvailability);
5233+ addFunctionBuilderBuildCompletion (
5234+ builder, componentType, FunctionBuilderBuildFunction::BuildFinalResult);
5235+ }
5236+
51395237 void getOverrideCompletions (SourceLoc Loc) {
51405238 if (!CurrDeclContext->isTypeContext ())
51415239 return ;
@@ -5154,6 +5252,10 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
51545252 addDesignatedInitializers (NTD);
51555253 addAssociatedTypes (NTD);
51565254 }
5255+
5256+ if (NTD && NTD->getAttrs ().hasAttribute <FunctionBuilderAttr>()) {
5257+ addFunctionBuilderBuildCompletions (NTD);
5258+ }
51575259 }
51585260};
51595261} // end anonymous namespace
0 commit comments