Ejemplo n.º 1
0
        private static string?GetMarkdown(SymbolResolutionResult result)
        {
            // all of the generated markdown includes the language id to avoid VS code rendering
            // with multiple borders
            switch (result.Symbol)
            {
            case ParameterSymbol parameter:
                return($"```bicep\nparam {parameter.Name}: {parameter.Type}\n```");

            case VariableSymbol variable:
                return($"```bicep\nvar {variable.Name}: {variable.Type}\n```");

            case ResourceSymbol resource:
                return($"```bicep\nresource {resource.Name}\n{resource.Type}\n```");

            case OutputSymbol output:
                return($"```bicep\noutput {output.Name}: {output.Type}\n```");

            case FunctionSymbol function when result.Origin is FunctionCallSyntax functionCall:
                // it's not possible for a non-function call syntax to resolve to a function symbol
                // but this simplifies the checks
                return(GetFunctionMarkdown(function, functionCall, result.Context.Compilation.GetSemanticModel()));

            default:
                return(null);
            }
        }
Ejemplo n.º 2
0
        private static string?GetMarkdown(HoverParams request, SymbolResolutionResult result)
        {
            // all of the generated markdown includes the language id to avoid VS code rendering
            // with multiple borders
            switch (result.Symbol)
            {
            case ImportedNamespaceSymbol import:
                return(CodeBlockWithDescription(
                           $"import {import.Name}", TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), import.DeclaringImport)));

            case ParameterSymbol parameter:
                return(CodeBlockWithDescription(
                           $"param {parameter.Name}: {parameter.Type}", TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), parameter.DeclaringParameter)));

            case VariableSymbol variable:
                return(CodeBlockWithDescription($"var {variable.Name}: {variable.Type}", TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), variable.DeclaringVariable)));

            case ResourceSymbol resource:
                return(CodeBlockWithDescription(
                           $"resource {resource.Name}\n{resource.Type}", TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), resource.DeclaringResource)));

            case ModuleSymbol module:
                var filePath = SyntaxHelper.TryGetModulePath(module.DeclaringModule, out _);
                if (filePath != null)
                {
                    return(CodeBlockWithDescription($"module {module.Name}\n'{filePath}'", TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), module.DeclaringModule)));
                }

                return(CodeBlockWithDescription($"module {module.Name}", TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), module.DeclaringModule)));

            case OutputSymbol output:
                return(CodeBlockWithDescription(
                           $"output {output.Name}: {output.Type}", TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), output.DeclaringOutput)));

            case BuiltInNamespaceSymbol builtInNamespace:
                return(CodeBlock($"{builtInNamespace.Name} namespace"));

            case FunctionSymbol function when result.Origin is FunctionCallSyntaxBase functionCall:
                // it's not possible for a non-function call syntax to resolve to a function symbol
                // but this simplifies the checks
                return(GetFunctionMarkdown(function, functionCall, result.Context.Compilation.GetEntrypointSemanticModel()));

            case PropertySymbol property:
                if (GetModuleParameterOrOutputDescription(request, result, $"{property.Name}: {property.Type}", out var codeBlock))
                {
                    return(codeBlock);
                }
                return(CodeBlockWithDescription($"{property.Name}: {property.Type}", property.Description));

            case LocalVariableSymbol local:
                return(CodeBlock($"{local.Name}: {local.Type}"));

            default:
                return(null);
            }
        }
Ejemplo n.º 3
0
        private static string?TryGetDescriptionMarkdown(SymbolResolutionResult result, DeclaredSymbol symbol)
        {
            if (symbol.DeclaringSyntax is StatementSyntax statementSyntax &&
                SemanticModelHelper.TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), statementSyntax) is { } description)
            {
                return(description);
            }

            return(null);
        }
Ejemplo n.º 4
0
        private static string?GetMarkdown(SymbolResolutionResult result)
        {
            // all of the generated markdown includes the language id to avoid VS code rendering
            // with multiple borders
            switch (result.Symbol)
            {
            case ParameterSymbol parameter:
                return($"```bicep\nparam {parameter.Name}: {parameter.Type}\n```");

            case VariableSymbol variable:
                return($"```bicep\nvar {variable.Name}: {variable.Type}\n```");

            case ResourceSymbol resource:
                return($"```bicep\nresource {resource.Name}\n{resource.Type}\n```");

            case ModuleSymbol module:
                var filePath = SyntaxHelper.TryGetModulePath(module.DeclaringModule, out _);
                if (filePath != null)
                {
                    return($"```bicep\nmodule {module.Name}\n{filePath}\n```");
                }

                return($"```bicep\nmodule {module.Name}\n```");

            case OutputSymbol output:
                return($"```bicep\noutput {output.Name}: {output.Type}\n```");

            case NamespaceSymbol namespaceSymbol:
                return($"```bicep\n{namespaceSymbol.Name} namespace\n```");

            case FunctionSymbol function when result.Origin is FunctionCallSyntax functionCall:
                // it's not possible for a non-function call syntax to resolve to a function symbol
                // but this simplifies the checks
                return(GetFunctionMarkdown(function, functionCall.Arguments, result.Origin, result.Context.Compilation.GetEntrypointSemanticModel()));

            case PropertySymbol property:
                var markdown = $"```bicep\n{property.Name}: {property.Type}\n```\n";
                if (property.Description is not null)
                {
                    markdown += $"{property.Description}\n";
                }

                return(markdown);

            case FunctionSymbol function when result.Origin is InstanceFunctionCallSyntax functionCall:
                return(GetFunctionMarkdown(function, functionCall.Arguments, result.Origin, result.Context.Compilation.GetEntrypointSemanticModel()));

            case LocalVariableSymbol local:
                return($"```bicep\n{local.Name}: {local.Type}\n```");

            default:
                return(null);
            }
        }
Ejemplo n.º 5
0
        private static MarkedStringsOrMarkupContent?GetMarkdown(HoverParams request, SymbolResolutionResult result)
        {
            // all of the generated markdown includes the language id to avoid VS code rendering
            // with multiple borders
            switch (result.Symbol)
            {
            case ImportedNamespaceSymbol import:
                return(WithMarkdown(CodeBlockWithDescription(
                                        $"import {import.Name}", TryGetDescriptionMarkdown(result, import))));

            case ParameterSymbol parameter:
                return(WithMarkdown(CodeBlockWithDescription(
                                        $"param {parameter.Name}: {parameter.Type}", TryGetDescriptionMarkdown(result, parameter))));

            case VariableSymbol variable:
                return(WithMarkdown(CodeBlockWithDescription($"var {variable.Name}: {variable.Type}", TryGetDescriptionMarkdown(result, variable))));

            case ResourceSymbol resource:
                var docsSuffix  = TryGetTypeDocumentationLink(resource) is { } typeDocsLink ? $"[View Type Documentation]({typeDocsLink})" : "";
                var description = TryGetDescriptionMarkdown(result, resource);

                return(WithMarkdown(CodeBlockWithDescription(
                                        $"resource {resource.Name} {(resource.Type is ResourceType ? $"'{resource.Type}'" : resource.Type)}",
                                        description is { } ? $"{description}\n{docsSuffix}" : docsSuffix)));
Ejemplo n.º 6
0
 private static string?GetMarkdown(SymbolResolutionResult result)
 {