public void Decompiler_handles_banned_function_replacement(string expression, string type, string expectedValue)
        {
            var template = @"{
    ""$schema"": ""https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"",
    ""contentVersion"": ""1.0.0.0"",
    ""parameters"": {},
    ""variables"": {
        ""a"": true,
        ""b"": false,
        ""c"": true
    },
    ""resources"": [],
    ""outputs"": {
        ""calculated"": {
            ""type"": """ + type + @""",
            ""value"": ""[" + expression + @"]""
        }
    }
}";

            var fileUri      = new Uri("file:///path/to/main.json");
            var fileResolver = new InMemoryFileResolver(new Dictionary <Uri, string>
            {
                [fileUri] = template,
            });

            var(entryPointUri, filesToSave) = TemplateDecompiler.DecompileFileWithModules(TestTypeHelper.CreateEmptyProvider(), fileResolver, fileUri);

            filesToSave[entryPointUri].Should().Contain($"output calculated {type} = ({expectedValue})");
        }
        public void Decompiler_handles_strings_with_newlines(string newline, string escapedNewline)
        {
            var template = @"{
    ""$schema"": ""https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"",
    ""contentVersion"": ""1.0.0.0"",
    ""parameters"": {},
    ""variables"": {
        ""multilineString"": ""multi
        line
        string""
    },
    ""resources"": [],
    ""outputs"": {}
}";

            // replace newlines with the style passed in
            template = string.Join(newline, Regex.Split(template, "\r?\n"));

            var fileUri      = new Uri("file:///path/to/main.json");
            var fileResolver = new InMemoryFileResolver(new Dictionary <Uri, string>
            {
                [fileUri] = template,
            });;

            var(entryPointUri, filesToSave) = TemplateDecompiler.DecompileFileWithModules(TestTypeHelper.CreateEmptyProvider(), fileResolver, fileUri);

            // this behavior is actually controlled by newtonsoft's deserializer, but we should assert it anyway to avoid regressions.
            filesToSave[entryPointUri].Should().Contain($"var multilineString = 'multi{escapedNewline}        line{escapedNewline}        string'");
        }
Exemple #3
0
        private static Compilation GetCompilation(string text)
        {
            var fileName     = "/main.bicep";
            var fileResolver = new InMemoryFileResolver(new Dictionary <string, string> {
                [fileName] = text
            }, filePath => "Modules are not supported in the Bicep Playground");
            var syntaxTreeGrouping = SyntaxTreeGroupingBuilder.Build(fileResolver, fileName);

            return(new Compilation(resourceTypeProvider, syntaxTreeGrouping));
        }
        private async Task <LanguageServerHelper> StartServerWithClientConnectionAsync(MultipleMessageListener <PublishDiagnosticsParams> diagsListener)
        {
            var fileSystemDict = new Dictionary <Uri, string>();
            var fileResolver   = new InMemoryFileResolver(fileSystemDict);
            var serverOptions  = new Server.CreationOptions(FileResolver: fileResolver);

            return(await LanguageServerHelper.StartServerWithClientConnectionAsync(
                       TestContext,
                       options =>
            {
                options.OnPublishDiagnostics(diags => diagsListener.AddMessage(diags));
            },
                       serverOptions));
        }
Exemple #5
0
        private async Task <(ILanguageClient, MultipleMessageListener <PublishDiagnosticsParams>, string testOutputPath)> StartServerWithClientConnectionAsync()
        {
            var fileSystemDict = new Dictionary <Uri, string>();
            var fileResolver   = new InMemoryFileResolver(fileSystemDict);
            var diagsListener  = new MultipleMessageListener <PublishDiagnosticsParams>();
            var serverOptions  = new Server.CreationOptions(FileResolver: fileResolver);
            var client         = await IntegrationTestHelper.StartServerWithClientConnectionAsync(
                TestContext,
                options =>
            {
                options.OnPublishDiagnostics(diags => diagsListener.AddMessage(diags));
            },
                serverOptions);

            var testOutputPath = Path.Combine(TestContext.ResultsDirectory, Guid.NewGuid().ToString());

            return(client, diagsListener, testOutputPath);
        }
Exemple #6
0
        public DecompileResult Decompile(string jsonContent)
        {
            var jsonUri = new Uri("inmemory:///main.json");

            var fileResolver = new InMemoryFileResolver(new Dictionary <Uri, string> {
                [jsonUri] = jsonContent,
            });

            try
            {
                var(entrypointUri, filesToSave) = TemplateDecompiler.DecompileFileWithModules(resourceTypeProvider, fileResolver, jsonUri);

                return(new DecompileResult(filesToSave[entrypointUri], null));
            }
            catch (Exception exception)
            {
                return(new DecompileResult(null, exception.Message));
            }
        }
Exemple #7
0
        public DecompileResult Decompile(string jsonContent)
        {
            var jsonUri = new Uri("inmemory:///main.json");

            var fileResolver = new InMemoryFileResolver(new Dictionary <Uri, string> {
                [jsonUri] = jsonContent,
            });

            try
            {
                var bicepUri   = PathHelper.ChangeToBicepExtension(jsonUri);
                var decompiler = new TemplateDecompiler(namespaceProvider, fileResolver, new EmptyModuleRegistryProvider(), new ConfigurationManager(new IOFileSystem()));
                var(entrypointUri, filesToSave) = decompiler.DecompileFileWithModules(jsonUri, bicepUri);

                return(new DecompileResult(filesToSave[entrypointUri], null));
            }
            catch (Exception exception)
            {
                return(new DecompileResult(null, exception.Message));
            }
        }
Exemple #8
0
        public static SyntaxTreeGrouping CreateForFiles(IReadOnlyDictionary <string, string> files, string entryFileName)
        {
            var fileResolver = new InMemoryFileResolver(files);

            return(SyntaxTreeGroupingBuilder.Build(fileResolver, entryFileName));
        }