@@ -1345,13 +1345,17 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
1345
1345
1346
1346
case CodeCompletionResult::ResultKind::Keyword:
1347
1347
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));
1350
1352
1351
1353
case CodeCompletionResult::ResultKind::BuiltinOperator:
1352
1354
case CodeCompletionResult::ResultKind::Pattern:
1353
1355
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));
1355
1359
1356
1360
case CodeCompletionResult::ResultKind::Literal:
1357
1361
assert (LiteralKind.hasValue ());
@@ -5136,6 +5140,100 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
5136
5140
}
5137
5141
}
5138
5142
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
+
5139
5237
void getOverrideCompletions (SourceLoc Loc) {
5140
5238
if (!CurrDeclContext->isTypeContext ())
5141
5239
return ;
@@ -5154,6 +5252,10 @@ class CompletionOverrideLookup : public swift::VisibleDeclConsumer {
5154
5252
addDesignatedInitializers (NTD);
5155
5253
addAssociatedTypes (NTD);
5156
5254
}
5255
+
5256
+ if (NTD && NTD->getAttrs ().hasAttribute <FunctionBuilderAttr>()) {
5257
+ addFunctionBuilderBuildCompletions (NTD);
5258
+ }
5157
5259
}
5158
5260
};
5159
5261
} // end anonymous namespace
0 commit comments