private async Task <IJavaScriptCompilation> CompileAndTraceAsync(LogTargets logTargets, bool throwOnCompilationError = true, bool suppressCompilationSummary = true) { try { IJavaScriptCompilation compilation = await _compilationService.GetFunctionCompilationAsync(Metadata); if (compilation.SupportsDiagnostics) { ImmutableArray <Diagnostic> diagnostics = compilation.GetDiagnostics(); TraceCompilationDiagnostics(diagnostics, logTargets); if (!suppressCompilationSummary) { bool compilationSucceeded = !diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error); TraceOnPrimaryHost(string.Format(CultureInfo.InvariantCulture, "Compilation {0}.", compilationSucceeded ? "succeeded" : "failed"), TraceLevel.Info); } } return(compilation); } catch (CompilationErrorException ex) { TraceOnPrimaryHost("Function compilation error", TraceLevel.Error); TraceCompilationDiagnostics(ex.Diagnostics, logTargets); if (throwOnCompilationError) { throw; } } return(null); }
public async Task GetCompilationResultAsync_WithPositivePredicate_ExecutesServiceCompilation() { var settingsManager = new ScriptSettingsManager(); var innerCompilationServiceMock = new Mock <ICompilationService <IJavaScriptCompilation> >(); innerCompilationServiceMock.Setup(m => m.GetFunctionCompilationAsync(It.IsAny <FunctionMetadata>())) .ReturnsAsync(new TestJavaScriptCompilation("test", ImmutableArray <Diagnostic> .Empty)); var compilationService = new ConditionalJavaScriptCompilationService(settingsManager, innerCompilationServiceMock.Object, () => true); var functionMetadata = new FunctionMetadata { Name = "testfunction", ScriptFile = "test.ts" }; IJavaScriptCompilation compilation = await compilationService.GetFunctionCompilationAsync(functionMetadata); Assert.NotNull(compilation); string result = await compilation.EmitAsync(CancellationToken.None); Assert.Equal("test", result); innerCompilationServiceMock.Verify(); }
private async Task <ScriptFunc> CreateFunctionTarget(CancellationToken cancellationToken) { string eventName = string.Format(MetricEventNames.FunctionCompileLatencyByLanguageFormat, _compilationService.Language); using (_metricsLogger.LatencyEvent(eventName)) { IJavaScriptCompilation compilation = await CompileAndTraceAsync(LogTargets.System, suppressCompilationSummary : true); string functionScriptPath = compilation.Emit(cancellationToken); string script = string.Format(CultureInfo.InvariantCulture, _functionTemplate, functionScriptPath.Replace('\\', '/')); return(Edge.Func(script)); } }
private async Task ReloadScriptAsync() { // one of the script files for this function changed // force a reload on next execution _functionLoader.Reset(); _scriptFunc = null; TraceOnPrimaryHost(string.Format(CultureInfo.InvariantCulture, "Script for function '{0}' changed. Reloading.", Metadata.Name), TraceLevel.Info); IJavaScriptCompilation compilation = await CompileAndTraceAsync(LogTargets.User, throwOnCompilationError : false); if (compilation.SupportsDiagnostics) { bool compilationSucceeded = !compilation.GetDiagnostics().Any(d => d.Severity == DiagnosticSeverity.Error); TraceOnPrimaryHost(string.Format(CultureInfo.InvariantCulture, "Compilation {0}.", compilationSucceeded ? "succeeded" : "failed"), TraceLevel.Info); } }