Exemplo n.º 1
0
        private Type GetParameterGenericType(ParameterAst parameter)
        {
            if (parameter.Attributes is null)
            {
                throw new ArgumentException($"Parameter '{parameter}' must have a type constraint");
            }

            TypeConstraintAst typeConstraint = null;

            foreach (AttributeBaseAst attribute in parameter.Attributes)
            {
                if (attribute is TypeConstraintAst foundTypeConstraint)
                {
                    typeConstraint = foundTypeConstraint;
                    break;
                }
            }

            if (typeConstraint is null)
            {
                throw new ArgumentException($"Parameter '{parameter}' must have a type constraint");
            }

            if (typeConstraint.TypeName is not GenericTypeName genericTypeName)
            {
                throw new ArgumentException($"Parameter '{parameter}' must declare a type of the form '[ArmParameter[TYPE]]'");
            }

            return(genericTypeName.GenericArguments[0].GetReflectionType());
        }
        public override AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
        {
            if (typeConstraintAst.Parent is CatchClauseAst)
            {
                return(base.VisitTypeConstraint(typeConstraintAst));
            }

            var        typeName    = typeConstraintAst.TypeName.Name;
            var        accelerator = ".";
            var        cmdName     = "Type constraint";
            HelpEntity help        = null;

            var(acceleratorName, acceleratorFullTypeName) = Helpers.ResolveAccelerator(typeName);
            if (acceleratorName != null)
            {
                typeName    = acceleratorName;
                accelerator = $", which is a type accelerator for '{acceleratorFullTypeName}'";
                help        = HelpTableQuery("about_type_accelerators");
                cmdName     = "Type accelerator";
            }
            else if (typeConstraintAst.Parent is ConvertExpressionAst)
            {
                return(base.VisitTypeConstraint(typeConstraintAst));
            }

            explanations.Add(
                new Explanation()
            {
                Description = $"Constrains the type to '{typeName}'{accelerator}",
                CommandName = cmdName,
                HelpResult  = help
            }.AddDefaults(typeConstraintAst, explanations));

            return(base.VisitTypeConstraint(typeConstraintAst));
        }
 public static TypeConstraintAst Update(
     this TypeConstraintAst ast,
     string typeName)
 {
     return(new TypeConstraintAst(
                ast.Extent,
                new TypeName(ast.TypeName.Extent, typeName)));
 }
Exemplo n.º 4
0
    public System.Object VisitTrap(System.Management.Automation.Language.TrapStatementAst trapStatementAst)
    {
        IScriptExtent mappedExtent = MapExtent(trapStatementAst.Extent);

        TypeConstraintAst mappedTrapType = (TypeConstraintAst)VisitTypeConstraint(trapStatementAst.TrapType);
        StatementBlockAst mappedBody     = (StatementBlockAst)VisitStatementBlock(trapStatementAst.Body);

        return(new TrapStatementAst(mappedExtent, mappedTrapType, mappedBody));
    }
 public static ConvertExpressionAst Update(
     this ConvertExpressionAst ast,
     TypeConstraintAst typeConstraint = null,
     ExpressionAst child = null)
 {
     return(new ConvertExpressionAst(
                ast.Extent,
                typeConstraint?.Clone() ?? ast.Type.Clone(),
                child?.Clone() ?? ast.Child.Clone()));
 }
 public static TrapStatementAst Update(
     this TrapStatementAst ast,
     TypeConstraintAst trapType            = null,
     IEnumerable <StatementAst> statements = null)
 {
     return(new TrapStatementAst(
                ast.Extent,
                trapType?.Clone() ?? ast.TrapType?.Clone(),
                ast.Body?.Update(statements)));
 }
Exemplo n.º 7
0
    public System.Object VisitConvertExpression(System.Management.Automation.Language.ConvertExpressionAst convertExpressionAst)
    {
        IScriptExtent mappedExtent = MapExtent(convertExpressionAst.Extent);

        TypeConstraintAst mappedTypeConstraint = (TypeConstraintAst)VisitTypeConstraint(convertExpressionAst.Attribute as TypeConstraintAst);
        ExpressionAst     mappedChild          = _VisitExpression(convertExpressionAst.Child);


        return(new ConvertExpressionAst(mappedExtent, mappedTypeConstraint, mappedChild));
    }
 public static TypeConstraintAst Update(
     this TypeConstraintAst ast,
     string typeName,
     IEnumerable <ITypeName> genericTypeArguments)
 {
     return(new TypeConstraintAst(
                ast.Extent,
                new GenericTypeName(
                    ast.TypeName.Extent,
                    new TypeName(ast.TypeName.Extent, typeName),
                    genericTypeArguments)));
 }
 public static TypeConstraintAst Update(
     this TypeConstraintAst ast,
     string typeName,
     int arrayRank)
 {
     return(new TypeConstraintAst(
                ast.Extent,
                new ArrayTypeName(
                    ast.TypeName.Extent,
                    new TypeName(ast.TypeName.Extent, typeName),
                    arrayRank)));
 }
Exemplo n.º 10
0
        private static bool TryGetTypeConstraint(ParameterAst parameter, out TypeConstraintAst typeConstraint)
        {
            if (parameter.Attributes is not null)
            {
                foreach (AttributeBaseAst attributeAst in parameter.Attributes)
                {
                    if (attributeAst is TypeConstraintAst foundTypeConstraint)
                    {
                        typeConstraint = foundTypeConstraint;
                        return(true);
                    }
                }
            }

            typeConstraint = null;
            return(false);
        }
Exemplo n.º 11
0
 public override AttributeBaseAst VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 => VisitOther(base.VisitTypeConstraint(typeConstraintAst));
Exemplo n.º 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);
        }
Exemplo n.º 13
0
 public override object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     script_.Write("[" + typeConstraintAst.TypeName + "]");
     return(typeConstraintAst);
 }
Exemplo n.º 14
0
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     Console.WriteLine("Visited an TypeConstraintAst.");
     return(typeConstraintAst);
 }
Exemplo n.º 15
0
 public override AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     Console.WriteLine("Visited an TypeConstraintAst.");
     Console.WriteLine("    " + typeConstraintAst.ToString().Replace(Environment.NewLine, Environment.NewLine + "    "));
     return(AstVisitAction.Continue);
 }
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst) => null;
Exemplo n.º 17
0
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     return(typeConstraintAst.Copy());
 }
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     throw PSTraceSource.NewArgumentException("ast");
 }
Exemplo n.º 19
0
 /// <summary/>
 public virtual AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst) => DefaultVisit(typeConstraintAst);
Exemplo n.º 20
0
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     throw new NotImplementedException();
 }
 public static TypeConstraintAst Update(this TypeConstraintAst ast, ITypeName typeName = null)
 {
     return(new TypeConstraintAst(ast.Extent, typeName ?? ast.TypeName));
 }
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     return(new TypeConstraintAst(typeConstraintAst.Extent, typeConstraintAst.TypeName));
 }
Exemplo n.º 23
0
 public override AstVisitAction VisitTypeConstraint(TypeConstraintAst ast)
 {
     return(AstVisitAction.Continue);
 }
Exemplo n.º 24
0
 public override AstVisitAction VisitTypeConstraint(TypeConstraintAst ast)
 {
     return(DoNextAction(ast));
 }
Exemplo n.º 25
0
 public virtual object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     return(typeConstraintAst);
 }
Exemplo n.º 26
0
 public override AstVisitAction VisitTypeConstraint(TypeConstraintAst ast)
 {
     return(Check(ast));
 }
Exemplo n.º 27
0
 public override AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     TryFindTypeIncompatibilities(typeConstraintAst.TypeName);
     return(AstVisitAction.SkipChildren);
 }
Exemplo n.º 28
0
 public override AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     throw new NotImplementedException(); //VisitTypeConstraint(typeConstraintAst);
 }
Exemplo n.º 29
0
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     return(false);
 }
Exemplo n.º 30
0
 public object VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
 {
     throw new UnexpectedElementException();
 }