コード例 #1
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     // Type expressions are not safe as they allow fingerprinting by providing
     // a set of types, you can inspect the types in the AppDomain implying which assemblies are in use
     // and their version
     throw PSTraceSource.NewArgumentException("ast");
 }
コード例 #2
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     // Type expressions are not safe as they allow fingerprinting by providing
     // a set of types, you can inspect the types in the AppDomain implying which assemblies are in use
     // and their version
     return(false);
 }
コード例 #3
0
        public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst)
        {
            if (typeExpressionAst.Parent is BinaryExpressionAst ||
                typeExpressionAst.Parent is CommandExpressionAst ||
                typeExpressionAst.Parent is AssignmentStatementAst)
            {
                HelpEntity help        = null;
                var        description = string.Empty;

                if (typeExpressionAst.TypeName.IsArray)
                {
                    description = $"Array of '{typeExpressionAst.TypeName.Name}'";
                    help        = new HelpEntity()
                    {
                        DocumentationLink = "https://docs.microsoft.com/en-us/powershell/scripting/lang-spec/chapter-04"
                    };
                }
                else if (typeExpressionAst.TypeName.IsGeneric)
                {
                    description = $"Generic type";
                    help        = new HelpEntity()
                    {
                        DocumentationLink = "https://docs.microsoft.com/en-us/powershell/scripting/lang-spec/chapter-04#44-generic-types"
                    };
                }

                explanations.Add(new Explanation()
                {
                    Description = description,
                    CommandName = "Type expression",
                    HelpResult  = help
                }.AddDefaults(typeExpressionAst, explanations));
            }
            return(base.VisitTypeExpression(typeExpressionAst));
        }
コード例 #4
0
 public static TypeExpressionAst Update(
     this TypeExpressionAst ast,
     string typeName)
 {
     return(new TypeExpressionAst(
                ast.Extent,
                new TypeName(ast.TypeName.Extent, typeName)));
 }
コード例 #5
0
        public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst)
        {
            var name = typeExpressionAst.TypeName.Name;

            _currentNode = new TypeExpression(name);

            return(AstVisitAction.SkipChildren);
        }
コード例 #6
0
 public static TypeExpressionAst Update(
     this TypeExpressionAst ast,
     string typeName,
     IEnumerable <ITypeName> genericTypeArguments)
 {
     return(new TypeExpressionAst(
                ast.Extent,
                new GenericTypeName(
                    ast.TypeName.Extent,
                    new TypeName(ast.TypeName.Extent, typeName),
                    genericTypeArguments)));
 }
コード例 #7
0
 public static TypeExpressionAst Update(
     this TypeExpressionAst ast,
     string typeName,
     int arrayRank)
 {
     return(new TypeExpressionAst(
                ast.Extent,
                new ArrayTypeName(
                    ast.TypeName.Extent,
                    new TypeName(ast.TypeName.Extent, typeName),
                    arrayRank)));
 }
コード例 #8
0
        /// <summary>
        /// AnalyzeScript: check that Write-Host or Console.Write are not used.
        /// </summary>
        public IEnumerable <DiagnosticRecord> AnalyzeScript(Ast ast, string fileName)
        {
            if (ast == null)
            {
                throw new ArgumentNullException(Strings.NullAstErrorMessage);
            }

            // Finds all CommandAsts.
            IEnumerable <Ast> commandAsts = ast.FindAll(testAst => testAst is CommandAst, true);

            // Iterrates all CommandAsts and check the command name.
            foreach (CommandAst cmdAst in commandAsts)
            {
                if (cmdAst.GetCommandName() != null && String.Equals(cmdAst.GetCommandName(), "write-host", StringComparison.OrdinalIgnoreCase))
                {
                    yield return(new DiagnosticRecord(String.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingWriteHostError, System.IO.Path.GetFileName(fileName)),
                                                      cmdAst.Extent, GetName(), DiagnosticSeverity.Warning, fileName));
                }
            }

            // Finds all InvokeMemberExpressionAst
            IEnumerable <Ast> invokeAsts = ast.FindAll(testAst => testAst is InvokeMemberExpressionAst, true);

            foreach (InvokeMemberExpressionAst invokeAst in invokeAsts)
            {
                TypeExpressionAst typeAst = invokeAst.Expression as TypeExpressionAst;
                if (typeAst == null || typeAst.TypeName == null || typeAst.TypeName.FullName == null)
                {
                    continue;
                }

                if (typeAst.TypeName.FullName.EndsWith("console", StringComparison.OrdinalIgnoreCase) &&
                    !String.IsNullOrWhiteSpace(invokeAst.Member.Extent.Text) && invokeAst.Member.Extent.Text.StartsWith("Write", StringComparison.OrdinalIgnoreCase))
                {
                    yield return(new DiagnosticRecord(String.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingConsoleWriteError, System.IO.Path.GetFileName(fileName), invokeAst.Member.Extent.Text),
                                                      invokeAst.Extent, GetName(), DiagnosticSeverity.Warning, fileName));
                }
            }
        }
コード例 #9
0
            public override AstVisitAction VisitCommand(CommandAst commandAst)
            {
                string commandName = commandAst?.GetCommandName();

                if (commandName == null)
                {
                    return(AstVisitAction.Continue);
                }

                if (commandName.Equals("New-Object"))
                {
                    if (!TryGetArgument(commandAst.CommandElements, 0, "TypeName", out CommandElementAst typeNameArg))
                    {
                        return(AstVisitAction.Continue);
                    }

                    if (!(typeNameArg is StringConstantExpressionAst typeNameStringExp))
                    {
                        return(AstVisitAction.Continue);
                    }

                    // We need the PowerShell parser to turn this into something structured now
                    TypeExpressionAst typeNameAst = (TypeExpressionAst)Parser.ParseInput("[" + typeNameStringExp.Value + "]", out Token[] tokens, out ParseError[] errors)
コード例 #10
0
        public override AstVisitAction VisitInvokeMemberExpression(InvokeMemberExpressionAst imeAst)
        {
            if (imeAst == null)
            {
                return(AstVisitAction.SkipChildren);
            }

            TypeExpressionAst typeAst = imeAst.Expression as TypeExpressionAst;

            if (typeAst == null || typeAst.TypeName == null || typeAst.TypeName.FullName == null)
            {
                return(AstVisitAction.SkipChildren);
            }

            if (typeAst.TypeName.FullName.EndsWith("console", StringComparison.OrdinalIgnoreCase) &&
                !String.IsNullOrWhiteSpace(imeAst.Member.Extent.Text) && imeAst.Member.Extent.Text.StartsWith("Write", StringComparison.OrdinalIgnoreCase))
            {
                records.Add(new DiagnosticRecord(String.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingConsoleWriteError, System.IO.Path.GetFileName(fileName), imeAst.Member.Extent.Text),
                                                 imeAst.Extent, GetName(), DiagnosticSeverity.Warning, fileName));
            }

            return(AstVisitAction.Continue);
        }
コード例 #11
0
 public override object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     script_.Write("[" + typeExpressionAst.TypeName + "]");
     return(typeExpressionAst);
 }
コード例 #12
0
        internal List <CompletionResult> GetResultHelper(CompletionContext completionContext, out int replacementIndex, out int replacementLength, bool isQuotedString)
        {
            replacementIndex  = -1;
            replacementLength = -1;
            Token tokenAtCursor          = completionContext.TokenAtCursor;
            Ast   lastAst                = completionContext.RelatedAsts.Last <Ast>();
            List <CompletionResult> list = null;

            if (tokenAtCursor == null)
            {
                if (!isQuotedString && (((((lastAst is CommandParameterAst) || (lastAst is CommandAst)) || ((lastAst is ExpressionAst) && (lastAst.Parent is CommandAst))) || ((lastAst is ExpressionAst) && (lastAst.Parent is CommandParameterAst))) || (((lastAst is ExpressionAst) && (lastAst.Parent is ArrayLiteralAst)) && ((lastAst.Parent.Parent is CommandAst) || (lastAst.Parent.Parent is CommandParameterAst)))))
                {
                    completionContext.WordToComplete = string.Empty;
                    HashtableAst hashtableAst = lastAst as HashtableAst;
                    if (hashtableAst != null)
                    {
                        completionContext.ReplacementIndex  = replacementIndex = completionContext.CursorPosition.Offset;
                        completionContext.ReplacementLength = replacementLength = 0;
                        list = CompletionCompleters.CompleteHashtableKey(completionContext, hashtableAst);
                    }
                    else
                    {
                        list              = CompletionCompleters.CompleteCommandArgument(completionContext);
                        replacementIndex  = completionContext.ReplacementIndex;
                        replacementLength = completionContext.ReplacementLength;
                    }
                }
                else if (!isQuotedString)
                {
                    bool flag = false;
                    if ((lastAst is ErrorExpressionAst) && (lastAst.Parent is FileRedirectionAst))
                    {
                        flag = true;
                    }
                    else if ((lastAst is ErrorStatementAst) && CompleteAgainstSwitchFile(lastAst, completionContext.TokenBeforeCursor))
                    {
                        flag = true;
                    }
                    if (flag)
                    {
                        completionContext.WordToComplete = string.Empty;
                        list              = new List <CompletionResult>(CompletionCompleters.CompleteFilename(completionContext));
                        replacementIndex  = completionContext.ReplacementIndex;
                        replacementLength = completionContext.ReplacementLength;
                    }
                }
            }
            else
            {
                TokenKind kind;
                replacementIndex  = tokenAtCursor.Extent.StartScriptPosition.Offset;
                replacementLength = tokenAtCursor.Extent.EndScriptPosition.Offset - replacementIndex;
                completionContext.ReplacementIndex  = replacementIndex;
                completionContext.ReplacementLength = replacementLength;
                switch (tokenAtCursor.Kind)
                {
                case TokenKind.ColonColon:
                case TokenKind.Dot:
                    replacementIndex += tokenAtCursor.Text.Length;
                    replacementLength = 0;
                    list = CompletionCompleters.CompleteMember(completionContext, tokenAtCursor.Kind == TokenKind.ColonColon);
                    goto Label_05DC;

                case TokenKind.Multiply:
                case TokenKind.Identifier:
                case TokenKind.Generic:
                    list = this.GetResultForIdentifier(completionContext, ref replacementIndex, ref replacementLength, isQuotedString);
                    goto Label_05DC;

                case TokenKind.Minus:
                    if (CompleteOperator(tokenAtCursor, lastAst))
                    {
                        list = CompletionCompleters.CompleteOperator("");
                    }
                    else if (CompleteAgainstStatementFlags(completionContext.RelatedAsts[0], null, tokenAtCursor, out kind))
                    {
                        completionContext.WordToComplete = tokenAtCursor.Text;
                        list = CompletionCompleters.CompleteStatementFlags(kind, completionContext.WordToComplete);
                    }
                    goto Label_05DC;

                case TokenKind.Redirection:
                    if ((lastAst is ErrorExpressionAst) && (lastAst.Parent is FileRedirectionAst))
                    {
                        completionContext.WordToComplete    = string.Empty;
                        completionContext.ReplacementIndex  = replacementIndex += tokenAtCursor.Text.Length;
                        completionContext.ReplacementLength = replacementLength = 0;
                        list = new List <CompletionResult>(CompletionCompleters.CompleteFilename(completionContext));
                    }
                    goto Label_05DC;

                case TokenKind.Variable:
                case TokenKind.SplattedVariable:
                    completionContext.WordToComplete = ((VariableToken)tokenAtCursor).VariablePath.UserPath;
                    list = CompletionCompleters.CompleteVariable(completionContext);
                    goto Label_05DC;

                case TokenKind.Parameter:
                    if (!isQuotedString)
                    {
                        completionContext.WordToComplete = tokenAtCursor.Text;
                        CommandAst parent = lastAst.Parent as CommandAst;
                        if ((!(lastAst is StringConstantExpressionAst) || (parent == null)) || (parent.CommandElements.Count != 1))
                        {
                            if (CompleteAgainstStatementFlags(null, lastAst, null, out kind))
                            {
                                list = CompletionCompleters.CompleteStatementFlags(kind, completionContext.WordToComplete);
                            }
                            else if (CompleteOperator(tokenAtCursor, lastAst))
                            {
                                list = CompletionCompleters.CompleteOperator(completionContext.WordToComplete);
                            }
                            else if (completionContext.WordToComplete.EndsWith(":", StringComparison.Ordinal))
                            {
                                replacementIndex  = tokenAtCursor.Extent.EndScriptPosition.Offset;
                                replacementLength = 0;
                                completionContext.WordToComplete = string.Empty;
                                list = CompletionCompleters.CompleteCommandArgument(completionContext);
                            }
                            else
                            {
                                list = CompletionCompleters.CompleteCommandParameter(completionContext);
                            }
                        }
                        else
                        {
                            list = CompleteFileNameAsCommand(completionContext);
                        }
                    }
                    goto Label_05DC;

                case TokenKind.Number:
                    if ((lastAst is ConstantExpressionAst) && (((lastAst.Parent is CommandAst) || (lastAst.Parent is CommandParameterAst)) || ((lastAst.Parent is ArrayLiteralAst) && ((lastAst.Parent.Parent is CommandAst) || (lastAst.Parent.Parent is CommandParameterAst)))))
                    {
                        completionContext.WordToComplete = tokenAtCursor.Text;
                        list              = CompletionCompleters.CompleteCommandArgument(completionContext);
                        replacementIndex  = completionContext.ReplacementIndex;
                        replacementLength = completionContext.ReplacementLength;
                    }
                    goto Label_05DC;

                case TokenKind.Comment:
                    if (!isQuotedString)
                    {
                        completionContext.WordToComplete = tokenAtCursor.Text;
                        list = CompletionCompleters.CompleteComment(completionContext);
                    }
                    goto Label_05DC;

                case TokenKind.StringLiteral:
                case TokenKind.StringExpandable:
                    list = this.GetResultForString(completionContext, ref replacementIndex, ref replacementLength, isQuotedString);
                    goto Label_05DC;

                case TokenKind.RBracket:
                    if (lastAst is TypeExpressionAst)
                    {
                        TypeExpressionAst       targetExpr = (TypeExpressionAst)lastAst;
                        List <CompletionResult> results    = new List <CompletionResult>();
                        CompletionCompleters.CompleteMemberHelper(true, "*", targetExpr, completionContext, results);
                        if (results.Count > 0)
                        {
                            replacementIndex++;
                            replacementLength = 0;
                            list = (from entry in results
                                    let completionText = TokenKind.ColonColon.Text() + entry.CompletionText
                                                         select new CompletionResult(completionText, entry.ListItemText, entry.ResultType, entry.ToolTip)).ToList <CompletionResult>();
                        }
                    }
                    goto Label_05DC;

                case TokenKind.Comma:
                    if ((lastAst is ErrorExpressionAst) && ((lastAst.Parent is CommandAst) || (lastAst.Parent is CommandParameterAst)))
                    {
                        replacementIndex += replacementLength;
                        replacementLength = 0;
                        list = CompletionCompleters.CompleteCommandArgument(completionContext);
                    }
                    goto Label_05DC;
                }
                if ((tokenAtCursor.TokenFlags & TokenFlags.Keyword) != TokenFlags.None)
                {
                    completionContext.WordToComplete = tokenAtCursor.Text;
                    list = CompleteFileNameAsCommand(completionContext);
                    List <CompletionResult> collection = CompletionCompleters.CompleteCommand(completionContext);
                    if ((collection != null) && (collection.Count > 0))
                    {
                        list.AddRange(collection);
                    }
                }
                else
                {
                    replacementIndex  = -1;
                    replacementLength = -1;
                }
            }
Label_05DC:
            if ((list == null) || (list.Count == 0))
            {
                TypeExpressionAst ast5 = completionContext.RelatedAsts.OfType <TypeExpressionAst>().FirstOrDefault <TypeExpressionAst>();
                TypeName          name = null;
                if (ast5 != null)
                {
                    name = FindTypeNameToComplete(ast5.TypeName, this._cursorPosition);
                }
                else
                {
                    TypeConstraintAst ast6 = completionContext.RelatedAsts.OfType <TypeConstraintAst>().FirstOrDefault <TypeConstraintAst>();
                    if (ast6 != null)
                    {
                        name = FindTypeNameToComplete(ast6.TypeName, this._cursorPosition);
                    }
                }
                if (name != null)
                {
                    replacementIndex  = name.Extent.StartOffset;
                    replacementLength = name.Extent.EndOffset - replacementIndex;
                    completionContext.WordToComplete = name.FullName;
                    list = CompletionCompleters.CompleteType(completionContext, "", "");
                }
            }
            if ((list == null) || (list.Count == 0))
            {
                HashtableAst ast7 = lastAst as HashtableAst;
                if (ast7 != null)
                {
                    completionContext.ReplacementIndex  = replacementIndex = completionContext.CursorPosition.Offset;
                    completionContext.ReplacementLength = replacementLength = 0;
                    list = CompletionCompleters.CompleteHashtableKey(completionContext, ast7);
                }
            }
            if ((list == null) || (list.Count == 0))
            {
                string text = completionContext.RelatedAsts[0].Extent.Text;
                if ((Regex.IsMatch(text, @"^[\S]+$") && (completionContext.RelatedAsts.Count > 0)) && (completionContext.RelatedAsts[0] is ScriptBlockAst))
                {
                    replacementIndex  = completionContext.RelatedAsts[0].Extent.StartScriptPosition.Offset;
                    replacementLength = completionContext.RelatedAsts[0].Extent.EndScriptPosition.Offset - replacementIndex;
                    completionContext.WordToComplete = text;
                    list = CompleteFileNameAsCommand(completionContext);
                }
            }
            return(list);
        }
コード例 #13
0
 public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     Console.WriteLine("Visited an TypeExpressionAst.");
     Console.WriteLine("    " + typeExpressionAst.ToString().Replace(Environment.NewLine, Environment.NewLine + "    "));
     return(AstVisitAction.Continue);
 }
コード例 #14
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     Console.WriteLine("Visited an TypeExpressionAst.");
     return(typeExpressionAst);
 }
コード例 #15
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     return(typeExpressionAst.Copy());
 }
コード例 #16
0
ファイル: VisitorBase.cs プロジェクト: altrive/PSCodeAnalyzer
 public override AstVisitAction VisitTypeExpression(TypeExpressionAst ast)
 {
     return(AstVisitAction.Continue);
 }
コード例 #17
0
 public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     TryFindTypeIncompatibilities(typeExpressionAst.TypeName);
     return(AstVisitAction.SkipChildren);
 }
コード例 #18
0
 public static TypeExpressionAst Update(this TypeExpressionAst ast, ITypeName typeName = null)
 {
     return(new TypeExpressionAst(ast.Extent, typeName ?? ast.TypeName));
 }
コード例 #19
0
 object ICustomAstVisitor.VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 => ProcessRewriter(VisitTypeExpression, typeExpressionAst);
コード例 #20
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     return(new TypeExpressionAst(typeExpressionAst.Extent, typeExpressionAst.TypeName));
 }
コード例 #21
0
 public override ExpressionAst VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 => VisitExpression(base.VisitTypeExpression(typeExpressionAst));
コード例 #22
0
 public override AstVisitAction VisitTypeExpression(TypeExpressionAst ast)
 {
     return(DoNextAction(ast));
 }
コード例 #23
0
 public virtual object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     return(typeExpressionAst);
 }
コード例 #24
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     throw new UnexpectedElementException();
 }
コード例 #25
0
        /// <summary>
        /// Visit function and checks that it is a cmdlet. If yes, then checks that any object returns must have a type declared
        /// in the output type (the only exception is if the type is object)
        /// </summary>
        /// <param name="funcAst"></param>
        /// <returns></returns>
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst funcAst)
        {
            if (funcAst == null || funcAst.Body == null || funcAst.Body.ParamBlock == null ||
                funcAst.Body.ParamBlock.Attributes == null || funcAst.Body.ParamBlock.Attributes.Count == 0 ||
                !funcAst.Body.ParamBlock.Attributes.Any(attr => attr.TypeName.GetReflectionType() == typeof(CmdletBindingAttribute)))
            {
                return(AstVisitAction.Continue);
            }

            HashSet <string> outputTypes = new HashSet <string>();

            foreach (AttributeAst attrAst in funcAst.Body.ParamBlock.Attributes)
            {
                if (attrAst.TypeName != null && attrAst.TypeName.GetReflectionType() == typeof(OutputTypeAttribute) &&
                    attrAst.PositionalArguments != null)
                {
                    foreach (ExpressionAst expAst in attrAst.PositionalArguments)
                    {
                        if (expAst is StringConstantExpressionAst)
                        {
                            Type type = Type.GetType((expAst as StringConstantExpressionAst).Value);
                            if (type != null)
                            {
                                outputTypes.Add(type.FullName);
                            }
                        }
                        else
                        {
                            TypeExpressionAst typeAst = expAst as TypeExpressionAst;
                            if (typeAst != null && typeAst.TypeName != null)
                            {
                                if (typeAst.TypeName.GetReflectionType() != null)
                                {
                                    outputTypes.Add(typeAst.TypeName.GetReflectionType().FullName);
                                }
                                else
                                {
                                    outputTypes.Add(typeAst.TypeName.FullName);
                                }
                            }
                        }
                    }
                }
            }

            #if PSV3
            List <Tuple <string, StatementAst> > returnTypes = FindPipelineOutput.OutputTypes(funcAst);
            #else
            List <Tuple <string, StatementAst> > returnTypes = FindPipelineOutput.OutputTypes(funcAst, _classes);
            #endif

            HashSet <string> specialTypes = new HashSet <string>(StringComparer.OrdinalIgnoreCase);
            specialTypes.Add(typeof(Unreached).FullName);
            specialTypes.Add(typeof(Undetermined).FullName);
            specialTypes.Add(typeof(object).FullName);
            specialTypes.Add(typeof(void).FullName);
            specialTypes.Add(typeof(PSCustomObject).FullName);
            specialTypes.Add(typeof(PSObject).FullName);

            foreach (Tuple <string, StatementAst> returnType in returnTypes)
            {
                string typeName = returnType.Item1;

                if (String.IsNullOrEmpty(typeName) ||
                    specialTypes.Contains(typeName) ||
                    outputTypes.Contains(typeName, StringComparer.OrdinalIgnoreCase))
                {
                    continue;
                }
                else
                {
                    DiagnosticRecords.Add(new DiagnosticRecord(string.Format(CultureInfo.CurrentCulture, Strings.UseOutputTypeCorrectlyError,
                                                                             funcAst.Name, typeName), returnType.Item2.Extent, GetName(), DiagnosticSeverity.Information, fileName));
                }
            }

            return(AstVisitAction.Continue);
        }
コード例 #26
0
 /// <summary/>
 public virtual AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst) => DefaultVisit(typeExpressionAst);
コード例 #27
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst) => null;
コード例 #28
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     throw new NotImplementedException();
 }
コード例 #29
0
 public object VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     return(true);
 }
コード例 #30
0
 public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst)
 {
     throw new NotImplementedException(typeExpressionAst.ToString());
 }