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); } }
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); } }
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); }
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); } }
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)));
private static string?GetMarkdown(SymbolResolutionResult result) {