Ejemplo n.º 1
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.º 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}", SemanticModelHelper.TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), import.DeclaringImport)));

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

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

            case ResourceSymbol resource:
                return(CodeBlockWithDescription(
                           $"resource {resource.Name}\n{resource.Type}", SemanticModelHelper.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}'", SemanticModelHelper.TryGetDescription(result.Context.Compilation.GetEntrypointSemanticModel(), module.DeclaringModule)));
                }

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

            case OutputSymbol output:
                return(CodeBlockWithDescription(
                           $"output {output.Name}: {output.Type}", SemanticModelHelper.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:
                return(CodeBlockWithDescription($"{property.Name}: {property.Type}", property.Description));

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

            default:
                return(null);
            }
        }
Ejemplo n.º 3
0
            public override void VisitFunctionCallSyntax(FunctionCallSyntax syntax)
            {
                // Look for usage of list*() stand-alone function, e.g.:
                //
                //   output badResult object = listKeys(resourceId('Microsoft.Storage/storageAccounts', 'storageName'), '2021-02-01')
                //

                if (SemanticModelHelper.TryGetFunctionInNamespace(model, AzNamespaceType.BuiltInName, syntax) is FunctionCallSyntaxBase listFunction &&
                    listFunction.Name.IdentifierName.StartsWithOrdinalInsensitively(ListFunctionPrefix))
                {
                    string foundMessage = string.Format(CoreResources.OutputsShouldNotContainSecretsFunction, syntax.Name.IdentifierName);
                    this.diagnostics.Add(parent.CreateDiagnosticForSpan(syntax.Span, foundMessage));
                }

                base.VisitFunctionCallSyntax(syntax);
            }
Ejemplo n.º 4
0
        private long?GetBatchSize(StatementSyntax statement)
        {
            var decorator = SemanticModelHelper.TryGetDecoratorInNamespace(
                context.SemanticModel,
                statement,
                SystemNamespaceType.BuiltInName,
                LanguageConstants.BatchSizePropertyName);

            if (decorator?.Arguments is { } arguments &&
                arguments.Count() == 1 &&
                arguments.ToList()[0].Expression is IntegerLiteralSyntax integerLiteral)
            {
                return(integerLiteral.Value);
            }
            return(null);
        }
Ejemplo n.º 5
0
        private static bool IsLoopIteratorExpression(SemanticModel semanticModel, SyntaxBase syntax, [NotNullWhen(true)] out VariableAccessSyntax?arrayVariable)
        {
            arrayVariable = null;

            // look for a range() function with 2 args
            if (SemanticModelHelper.TryGetFunctionInNamespace(semanticModel, "sys", syntax) is not FunctionCallSyntaxBase rangeFunction ||
                !LanguageConstants.IdentifierComparer.Equals(rangeFunction.Name.IdentifierName, "range") ||
                rangeFunction.Arguments.Count() != 2)
            {
                return(false);
            }

            // first range() arg must be 0
            if (rangeFunction.GetArgumentByPosition(0).Expression is not IntegerLiteralSyntax startRange ||
                startRange.Value != 0)
            {
                return(false);
            }

            // look for a length() function with 1 arg
            if (SemanticModelHelper.TryGetFunctionInNamespace(semanticModel, "sys", rangeFunction.GetArgumentByPosition(1).Expression) is not FunctionCallSyntaxBase lengthFunction ||
                !LanguageConstants.IdentifierComparer.Equals(lengthFunction.Name.IdentifierName, "length") ||
                lengthFunction.Arguments.Count() != 1)
            {
                return(false);
            }

            // first length() arg must be a variable
            if (lengthFunction.GetArgumentByPosition(0).Expression is not VariableAccessSyntax variableAccess)
            {
                return(false);
            }

            arrayVariable = variableAccess;
            return(true);
        }