Skip to content

Commit 8ac5370

Browse files
committed
Fixing compilation warning for $return bindings
1 parent ac87ce6 commit 8ac5370

File tree

5 files changed

+65
-22
lines changed

5 files changed

+65
-22
lines changed

sample/DocumentDB-CSharp/run.csx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System;
22

3-
public static object Run(string input, out object newItem)
3+
public static object Run(string input)
44
{
55
return new
66
{

src/WebJobs.Script/Description/DotNet/DotNetFunctionInvoker.cs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ private void ReloadScript()
123123
compilationResult = compilation.GetDiagnostics();
124124

125125
signature = compilation.GetEntryPointSignature(_functionEntryPointResolver);
126-
compilationResult = ValidateFunctionBindingArguments(signature, compilationResult.ToBuilder());
126+
compilationResult = ValidateFunctionBindingArguments(signature, _triggerInputName, _inputBindings, _outputBindings, compilationResult.ToBuilder());
127127
}
128128
catch (CompilationErrorException exc)
129129
{
@@ -288,7 +288,7 @@ private async Task<MethodInfo> CreateFunctionTarget(CancellationToken cancellati
288288
ICompilation compilation = _compilationService.GetFunctionCompilation(Metadata);
289289
FunctionSignature functionSignature = compilation.GetEntryPointSignature(_functionEntryPointResolver);
290290

291-
ImmutableArray<Diagnostic> bindingDiagnostics = ValidateFunctionBindingArguments(functionSignature, throwIfFailed: true);
291+
ImmutableArray<Diagnostic> bindingDiagnostics = ValidateFunctionBindingArguments(functionSignature, _triggerInputName, _inputBindings, _outputBindings, throwIfFailed: true);
292292
TraceCompilationDiagnostics(bindingDiagnostics);
293293

294294
Assembly assembly = compilation.EmitAndLoad(cancellationToken);
@@ -373,21 +373,22 @@ private ImmutableArray<Diagnostic> GetFunctionDiagnostics(Diagnostic diagnostic)
373373
return ImmutableArray<Diagnostic>.Empty;
374374
}
375375

376-
private ImmutableArray<Diagnostic> ValidateFunctionBindingArguments(FunctionSignature functionSignature,
376+
internal static ImmutableArray<Diagnostic> ValidateFunctionBindingArguments(FunctionSignature functionSignature, string triggerInputName,
377+
Collection<FunctionBinding> inputBindings, Collection<FunctionBinding> outputBindings,
377378
ImmutableArray<Diagnostic>.Builder builder = null, bool throwIfFailed = false)
378379
{
379380
var resultBuilder = builder ?? ImmutableArray<Diagnostic>.Empty.ToBuilder();
380381

381-
if (!functionSignature.Parameters.Any(p => string.Compare(p.Name, _triggerInputName, StringComparison.Ordinal) == 0))
382+
if (!functionSignature.Parameters.Any(p => string.Compare(p.Name, triggerInputName, StringComparison.Ordinal) == 0))
382383
{
383-
string message = string.Format(CultureInfo.InvariantCulture, "Missing a trigger argument named '{0}'.", _triggerInputName);
384+
string message = string.Format(CultureInfo.InvariantCulture, "Missing a trigger argument named '{0}'.", triggerInputName);
384385
var descriptor = new DiagnosticDescriptor(DotNetConstants.MissingTriggerArgumentCompilationCode,
385386
"Missing trigger argument", message, "AzureFunctions", DiagnosticSeverity.Error, true);
386387

387388
resultBuilder.Add(Diagnostic.Create(descriptor, Location.None));
388389
}
389390

390-
var bindings = _inputBindings.Where(b => !b.Metadata.IsTrigger).Union(_outputBindings);
391+
var bindings = inputBindings.Where(b => !b.Metadata.IsTrigger).Union(outputBindings);
391392

392393
foreach (var binding in bindings)
393394
{
@@ -396,6 +397,11 @@ private ImmutableArray<Diagnostic> ValidateFunctionBindingArguments(FunctionSign
396397
continue;
397398
}
398399

400+
if (binding.Metadata.IsReturn)
401+
{
402+
continue;
403+
}
404+
399405
if (!functionSignature.Parameters.Any(p => string.Compare(p.Name, binding.Metadata.Name, StringComparison.Ordinal) == 0))
400406
{
401407
string message = string.Format(CultureInfo.InvariantCulture,

test/WebJobs.Script.Tests/Description/DotNet/DotNetFunctionDescriptorProviderTests.cs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22
// Licensed under the MIT License. See License.txt in the project root for license information.
33

44
using System;
5-
using System.Diagnostics;
65
using System.Reflection;
76
using System.Threading.Tasks;
87
using Microsoft.Azure.WebJobs.Script.Binding;
98
using Microsoft.Azure.WebJobs.Script.Description;
10-
using Microsoft.Azure.WebJobs.Script.Extensibility;
119
using Newtonsoft.Json.Linq;
1210
using Xunit;
1311

@@ -25,7 +23,7 @@ public void TryCreateReturnValueParameterDescriptor_ReturnBindingPresent_Returns
2523
{ "direction", "out" },
2624
{ "path", "foo/bar" }
2725
};
28-
FunctionBinding functionBinding = CreateTestBlobBinding(json);
26+
FunctionBinding functionBinding = TestHelpers.CreateTestBinding(json);
2927
FunctionBinding[] bindings = new FunctionBinding[] { functionBinding };
3028

3129
ParameterDescriptor descriptor = null;
@@ -60,23 +58,12 @@ public void TryCreateReturnValueParameterDescriptor_NoReturnBinding_ReturnsExpec
6058
{ "direction", "out" },
6159
{ "path", "foo/bar" }
6260
};
63-
FunctionBinding functionBinding = CreateTestBlobBinding(json);
61+
FunctionBinding functionBinding = TestHelpers.CreateTestBinding(json);
6462
FunctionBinding[] bindings = new FunctionBinding[] { functionBinding };
6563

6664
ParameterDescriptor descriptor = null;
6765
var result = DotNetFunctionDescriptorProvider.TryCreateReturnValueParameterDescriptor(typeof(string), bindings, out descriptor);
6866
Assert.False(result);
6967
}
70-
71-
private static FunctionBinding CreateTestBlobBinding(JObject json)
72-
{
73-
ScriptBindingContext context = new ScriptBindingContext(json);
74-
WebJobsCoreScriptBindingProvider provider = new WebJobsCoreScriptBindingProvider(new JobHostConfiguration(), new JObject(), new TestTraceWriter(TraceLevel.Verbose));
75-
ScriptBinding scriptBinding = null;
76-
provider.TryCreate(context, out scriptBinding);
77-
BindingMetadata bindingMetadata = BindingMetadata.Create(json);
78-
ScriptHostConfiguration config = new ScriptHostConfiguration();
79-
return new ExtensionBinding(config, scriptBinding, bindingMetadata);
80-
}
8168
}
8269
}

test/WebJobs.Script.Tests/Description/DotNet/DotNetFunctionInvokerTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Microsoft.CodeAnalysis;
1717
using Microsoft.CodeAnalysis.Scripting;
1818
using Moq;
19+
using Newtonsoft.Json.Linq;
1920
using Xunit;
2021

2122
namespace Microsoft.Azure.WebJobs.Script.Tests.Description.DotNet
@@ -141,6 +142,39 @@ public async Task Compilation_OnSecondaryHost_SuppressesLogs()
141142
Assert.Equal(0, count);
142143
}
143144

145+
[Fact]
146+
public void ValidateFunctionBindingArguments_ReturnBinding_Succeeds()
147+
{
148+
Collection<FunctionParameter> parameters = new Collection<FunctionParameter>()
149+
{
150+
new FunctionParameter("input", "String", false, RefKind.None)
151+
};
152+
FunctionSignature signature = new FunctionSignature("Test", "Test", ImmutableArray.CreateRange<FunctionParameter>(parameters), false);
153+
154+
Collection<FunctionBinding> inputBindings = new Collection<FunctionBinding>()
155+
{
156+
TestHelpers.CreateTestBinding(new JObject
157+
{
158+
{ "type", "blobTrigger" },
159+
{ "name", "input" },
160+
{ "direction", "in" },
161+
{ "path", "test" }
162+
})
163+
};
164+
Collection<FunctionBinding> outputBindings = new Collection<FunctionBinding>()
165+
{
166+
TestHelpers.CreateTestBinding(new JObject
167+
{
168+
{ "type", "blob" },
169+
{ "name", ScriptConstants.SystemReturnParameterBindingName },
170+
{ "direction", "out" },
171+
{ "path", "test/test" }
172+
})
173+
};
174+
var diagnostics = DotNetFunctionInvoker.ValidateFunctionBindingArguments(signature, "input", inputBindings, outputBindings);
175+
Assert.Equal(0, diagnostics.Count());
176+
}
177+
144178
private RunDependencies CreateDependencies(TraceLevel traceLevel = TraceLevel.Info)
145179
{
146180
var dependencies = new RunDependencies();

test/WebJobs.Script.Tests/TestHelpers.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Collections.ObjectModel;
7+
using System.Diagnostics;
78
using System.IO;
89
using System.Linq;
910
using System.Text;
1011
using System.Threading.Tasks;
12+
using Microsoft.Azure.WebJobs.Script.Binding;
13+
using Microsoft.Azure.WebJobs.Script.Description;
14+
using Microsoft.Azure.WebJobs.Script.Extensibility;
1115
using Microsoft.WindowsAzure.Storage.Blob;
16+
using Newtonsoft.Json.Linq;
1217

1318
namespace Microsoft.Azure.WebJobs.Script.Tests
1419
{
@@ -121,5 +126,16 @@ public static DirectoryInfo GetFunctionLogFileDirectory(string functionName)
121126
string functionLogsPath = Path.Combine(Path.GetTempPath(), "Functions", "Function", functionName);
122127
return new DirectoryInfo(functionLogsPath);
123128
}
129+
130+
public static FunctionBinding CreateTestBinding(JObject json)
131+
{
132+
ScriptBindingContext context = new ScriptBindingContext(json);
133+
WebJobsCoreScriptBindingProvider provider = new WebJobsCoreScriptBindingProvider(new JobHostConfiguration(), new JObject(), new TestTraceWriter(TraceLevel.Verbose));
134+
ScriptBinding scriptBinding = null;
135+
provider.TryCreate(context, out scriptBinding);
136+
BindingMetadata bindingMetadata = BindingMetadata.Create(json);
137+
ScriptHostConfiguration config = new ScriptHostConfiguration();
138+
return new ExtensionBinding(config, scriptBinding, bindingMetadata);
139+
}
124140
}
125141
}

0 commit comments

Comments
 (0)