From 2d749699294938aa2295636397fdcdba926bc59a Mon Sep 17 00:00:00 2001 From: Anthony Martin <38542602+anthony-c-martin@users.noreply.github.com> Date: Fri, 10 Jan 2025 15:51:52 -0500 Subject: [PATCH] Support object property name completions in lambda body syntax --- .../TypeSystem/DeclaredTypeManager.cs | 8 +++++ .../CompletionTests.cs | 30 +++++++++++++++++++ .../Helpers/ServerRequestHelper.cs | 8 +++++ 3 files changed, 46 insertions(+) diff --git a/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs b/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs index ea6e920b68c..e0c60956d94 100644 --- a/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs +++ b/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs @@ -1790,6 +1790,14 @@ AccessExpressionSyntax access when access.BaseExpression is ForSyntax var type = TypeHelper.MakeRequiredPropertiesOptional(enclosingObjectType); return TryCreateAssignment(type, syntax); + + case TypedLambdaSyntax lambda when binder.IsEqualOrDescendent(syntax, lambda.Body): + if (GetTypedLambdaType(lambda).Reference is not LambdaType lambdaType) + { + return null; + } + + return TryCreateAssignment(lambdaType.ReturnType, syntax); } return null; diff --git a/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs b/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs index ff0be80ccda..2aa7b35a01d 100644 --- a/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs +++ b/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs @@ -5204,5 +5204,35 @@ public async Task String_literal_union_with_object_value_should_not_cause_stack_ var completions = await mainFile.RequestCompletion(cursor); completions.Should().BeEmpty(); } + + [TestMethod] + // https://github.com/azure/bicep/issues/14429 + public async Task Lambda_output_type_completions_are_offered() + { + var serverHelper = new ServerRequestHelper(TestContext, DefaultServer); + + var (text, cursor) = ParserHelper.GetFileWithSingleCursor(""" +type fooType = { + bar: 'bar' +} + +func fooFunc() fooType => { + | +} +"""); + var mainFile = await serverHelper.OpenFile("/main.bicep", text); + + var newFile = await mainFile.RequestAndApplyCompletion(cursor, "bar"); + + newFile.Should().HaveSourceText(""" +type fooType = { + bar: 'bar' +} + +func fooFunc() fooType => { + bar:| +} +"""); + } } } diff --git a/src/Bicep.LangServer.IntegrationTests/Helpers/ServerRequestHelper.cs b/src/Bicep.LangServer.IntegrationTests/Helpers/ServerRequestHelper.cs index d3598a4d610..97d3d2dfbfa 100644 --- a/src/Bicep.LangServer.IntegrationTests/Helpers/ServerRequestHelper.cs +++ b/src/Bicep.LangServer.IntegrationTests/Helpers/ServerRequestHelper.cs @@ -148,6 +148,14 @@ public BicepFile ApplyCompletion(CompletionItem completion, params string[] tabS return SourceFileFactory.CreateBicepFile(bicepFile.Uri, replaced); } + public async Task RequestAndApplyCompletion(int cursor, string label) + { + var completionList = await RequestCompletion(cursor); + var completion = completionList.Should().ContainSingle(x => x.Label == label).Subject; + + return ApplyCompletion(completion); + } + public BicepFile ApplyWorkspaceEdit(WorkspaceEdit? edit) { // not yet supported by this logic