/// <summary>
        /// Decides if the current function defintion is the right defition
        /// for the symbol being searched for. The defintion of the symbol will be a of type 
        /// SymbolType.Function and have the same name as the symbol
        /// </summary>
        /// <param name="functionDefinitionAst">A FunctionDefinitionAst in the script's AST</param>
        /// <returns>A descion to stop searching if the right FunctionDefinitionAst was found, 
        /// or a decision to continue if it wasn't found</returns>
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
        {
            // Get the start column number of the function name, 
            // instead of the the start column of 'function' and create new extent for the functionName
            int startColumnNumber =
                functionDefinitionAst.Extent.Text.IndexOf(
                    functionDefinitionAst.Name) + 1;

            IScriptExtent nameExtent = new ScriptExtent()
            {
                Text = functionDefinitionAst.Name,
                StartLineNumber = functionDefinitionAst.Extent.StartLineNumber,
                StartColumnNumber = startColumnNumber,
                EndLineNumber = functionDefinitionAst.Extent.StartLineNumber,
                EndColumnNumber = startColumnNumber + functionDefinitionAst.Name.Length
            };

            if (symbolRef.SymbolType.Equals(SymbolType.Function) &&
                 nameExtent.Text.Equals(symbolRef.ScriptRegion.Text, StringComparison.InvariantCultureIgnoreCase))
            {
                this.FoundDeclartion =
                    new SymbolReference(
                        SymbolType.Function,
                        nameExtent);

                return AstVisitAction.StopVisit;
            }

            return base.VisitFunctionDefinition(functionDefinitionAst);
        }
        /// <summary>
        /// Checks to see if this function definition is the symbol we are looking for.
        /// </summary>
        /// <param name="functionDefinitionAst">A functionDefinitionAst object in the script's AST</param>
        /// <returns>A descion to stop searching if the right symbol was found, 
        /// or a decision to continue if it wasn't found</returns>
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
        {
            int startColumnNumber =
                functionDefinitionAst.Extent.Text.IndexOf(
                    functionDefinitionAst.Name) + 1;

            IScriptExtent nameExtent = new ScriptExtent()
            {
                Text = functionDefinitionAst.Name,
                StartLineNumber = functionDefinitionAst.Extent.StartLineNumber,
                EndLineNumber = functionDefinitionAst.Extent.EndLineNumber,
                StartColumnNumber = startColumnNumber,
                EndColumnNumber = startColumnNumber + functionDefinitionAst.Name.Length
            };

            if (this.IsPositionInExtent(nameExtent))
            {
                this.FoundSymbolReference =
                    new SymbolReference(
                        SymbolType.Function,
                        nameExtent);

                return AstVisitAction.StopVisit;
            }

            return base.VisitFunctionDefinition(functionDefinitionAst);
        }
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst ast)
 {
     if (ast.IsWorkflow)
     {
         return AstVisitAction.SkipChildren;
     }
     return base.CheckScriptBlock(ast);
 }
        /// <summary>
        /// Visit function and skips any function that starts with show
        /// </summary>
        /// <param name="funcAst"></param>
        /// <returns></returns>
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst funcAst)
        {
            if (funcAst == null || funcAst.Name == null)
            {
                return AstVisitAction.SkipChildren;
            }

            if (funcAst.Name.StartsWith("show", StringComparison.OrdinalIgnoreCase))
            {
                return AstVisitAction.SkipChildren;
            }

            return AstVisitAction.Continue;
        }
示例#5
0
    public System.Object VisitFunctionDefinition(System.Management.Automation.Language.FunctionDefinitionAst functionDefinitionAst)
    {
        IScriptExtent mappedExtent = MapExtent(functionDefinitionAst.Extent);

        LinkedList <ParameterAst> mappedParameters = new LinkedList <ParameterAst>();

        if (functionDefinitionAst.Parameters != null)
        {
            foreach (ParameterAst p in functionDefinitionAst.Parameters)
            {
                mappedParameters.AddLast((ParameterAst)VisitParameter(p));
            }
        }
        ScriptBlockAst mappedBody = (ScriptBlockAst)VisitScriptBlock(functionDefinitionAst.Body);

        return(new FunctionDefinitionAst(mappedExtent, functionDefinitionAst.IsFilter, functionDefinitionAst.IsWorkflow, functionDefinitionAst.Name, mappedParameters, mappedBody));
    }
示例#6
0
 internal static void DefineFunction(ExecutionContext context, FunctionDefinitionAst functionDefinitionAst, ScriptBlockExpressionWrapper scriptBlockExpressionWrapper)
 {
     try
     {
         ScriptBlock scriptBlock = scriptBlockExpressionWrapper.GetScriptBlock(context, functionDefinitionAst.IsFilter);
         context.EngineSessionState.SetFunctionRaw(functionDefinitionAst.Name, scriptBlock, context.EngineSessionState.CurrentScope.ScopeOrigin);
     }
     catch (Exception exception)
     {
         CommandProcessorBase.CheckForSevereException(exception);
         RuntimeException exception2 = exception as RuntimeException;
         if (exception2 == null)
         {
             throw ExceptionHandlingOps.ConvertToRuntimeException(exception, functionDefinitionAst.Extent);
         }
         InterpreterError.UpdateExceptionErrorRecordPosition(exception2, functionDefinitionAst.Extent);
         throw;
     }
 }
        /// <summary>
        /// Adds each function defintion as a 
        /// </summary>
        /// <param name="functionDefinitionAst">A functionDefinitionAst object in the script's AST</param>
        /// <returns>A decision to stop searching if the right symbol was found, 
        /// or a decision to continue if it wasn't found</returns>
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
        {
            IScriptExtent nameExtent = new ScriptExtent() {
                Text = functionDefinitionAst.Name,
                StartLineNumber = functionDefinitionAst.Extent.StartLineNumber,
                EndLineNumber = functionDefinitionAst.Extent.EndLineNumber,
                StartColumnNumber = functionDefinitionAst.Extent.StartColumnNumber,
                EndColumnNumber = functionDefinitionAst.Extent.EndColumnNumber
            };

            SymbolType symbolType = 
                functionDefinitionAst.IsWorkflow ? 
                    SymbolType.Workflow : SymbolType.Function;

            this.SymbolReferences.Add(
                new SymbolReference(
                    symbolType,
                    nameExtent));

            return AstVisitAction.Continue;
        }
示例#8
0
 public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return(AutomationNull.Value);
 }
示例#9
0
 /// <summary/>
 public virtual AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return(AstVisitAction.Continue);
 }
 /// <summary>
 /// Adds each function defintion as a 
 /// </summary>
 /// <param name="functionDefinitionAst">A functionDefinitionAst object in the script's AST</param>
 /// <returns>A decision to stop searching if the right symbol was found, 
 /// or a decision to continue if it wasn't found</returns>
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return this.findSymbolsVisitor.VisitFunctionDefinition(functionDefinitionAst);
 }
示例#11
0
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst ast)
 {
     return(CheckScriptBlock(ast));
 }
示例#12
0
 /// <summary/>
 public virtual object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return(null);
 }
示例#13
0
 public virtual AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return AstVisitAction.Continue;
 }
示例#14
0
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
        {
            var functionInfo = new /*FunctionInfo*/ScriptInfo(functionDefinitionAst.Name, functionDefinitionAst.Body.GetScriptBlock());

            // HACK: we shouldn't be casting this. But I'm too confused about runspace management in Pash.
            ((LocalRunspace)this._context.CurrentRunspace).CommandManager.SetFunction(functionInfo);

            return AstVisitAction.SkipChildren;
        }
        /// <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);
                                }
                            }
                        }
                    }
                }
            }

            List<Tuple<string, StatementAst>> returnTypes = FindPipelineOutput.OutputTypes(funcAst, _classes);

            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;
        }
示例#16
0
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     if (!(functionDefinitionAst.Parent is FunctionMemberAst))
     {
         _symbolTable.EnterScope(functionDefinitionAst.Body, ScopeType.Function);
     }
     return AstVisitAction.Continue;
 }
示例#17
0
 public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) { throw PSTraceSource.NewArgumentException("ast"); }
示例#18
0
 public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) { return AutomationNull.Value; }
示例#19
0
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst ast)
 {
     return this.CheckScriptBlock(ast);
 }
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     this.ReportError(functionDefinitionAst, () => ParserStrings.FunctionDeclarationNotSupportedInDataSection, new object[0]);
     return(AstVisitAction.Continue);
 }
示例#21
0
 /// <summary/>
 public virtual AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) => DefaultVisit(functionDefinitionAst);
示例#22
0
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst ast)
        {
            // Skip the workflow. We are not interested in the UsingExpressions in a workflow
            if (ast.IsWorkflow)
            {
                return AstVisitAction.SkipChildren;
            }

            return CheckScriptBlock(ast);
        }
示例#23
0
        public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
        {
            if (functionDefinitionAst.IsWorkflow)
            {
                if (_generatedCallToDefineWorkflows)
                    return ExpressionCache.Empty;

                var topAst = functionDefinitionAst.Parent;
                while (!(topAst is ScriptBlockAst))
                {
                    topAst = topAst.Parent;
                }

                _generatedCallToDefineWorkflows = true;
                return Expression.Call(CachedReflectionInfo.FunctionOps_DefineWorkflows,
                                       _executionContextParameter,
                                       Expression.Constant(topAst, typeof(ScriptBlockAst)));
            }

            return Expression.Call(CachedReflectionInfo.FunctionOps_DefineFunction,
                                   _executionContextParameter,
                                   Expression.Constant(functionDefinitionAst),
                                   Expression.Constant(new ScriptBlockExpressionWrapper(functionDefinitionAst)));
        }
示例#24
0
 public override object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     if (!(functionDefinitionAst.Parent is FunctionMemberAst))
     {
         _symbolResolver._symbolTable.LeaveScope();
     }
     return null;
 }
示例#25
0
 private static ScriptBlock CreateFakeScriptBlockForWorkflow(FunctionDefinitionAst functionDefinitionAst)
 {
     Token[] tokenArray;
     ParseError[] errorArray;
     StringBuilder builder = new StringBuilder();
     ReadOnlyCollection<ParameterAst> parameters = ((IParameterMetadataProvider) functionDefinitionAst).Parameters;
     if (parameters != null)
     {
         bool flag = true;
         foreach (ParameterAst ast in parameters)
         {
             if (!flag)
             {
                 builder.Append(", ");
             }
             flag = false;
             builder.Append(ast.Extent.Text);
         }
         if (!flag)
         {
             builder.Append(", ");
         }
     }
     return Parser.ParseInput(string.Format(CultureInfo.InvariantCulture, "\r\n                [CmdletBinding()]\r\n                param (\r\n                    {0}\r\n                    [hashtable[]] $PSParameterCollection,\r\n                    [string[]] $PSComputerName,\r\n                    [ValidateNotNullOrEmpty()] $PSCredential,\r\n                    [int32] $PSConnectionRetryCount,\r\n                    [int32] $PSConnectionRetryIntervalSec,\r\n                    [ValidateRange(1, 2147483)][int32] $PSRunningTimeoutSec,\r\n                    [ValidateRange(1, 2147483)][int32] $PSElapsedTimeoutSec,\r\n                    [bool] $PSPersist,\r\n                    [ValidateNotNullOrEmpty()] [System.Management.Automation.Runspaces.AuthenticationMechanism] $PSAuthentication,\r\n                    [ValidateNotNullOrEmpty()][System.Management.AuthenticationLevel] $PSAuthenticationLevel,\r\n                    [ValidateNotNullOrEmpty()] [string] $PSApplicationName,\r\n                    [int32] $PSPort,\r\n                    [switch] $PSUseSSL,\r\n                    [ValidateNotNullOrEmpty()] [string] $PSConfigurationName,\r\n                    [ValidateNotNullOrEmpty()][string[]] $PSConnectionURI,\r\n                    [switch] $PSAllowRedirection,\r\n                    [ValidateNotNullOrEmpty()][System.Management.Automation.Remoting.PSSessionOption] $PSSessionOption,\r\n                    [ValidateNotNullOrEmpty()] [string] $PSCertificateThumbprint,\r\n                    [hashtable] $PSPrivateMetadata,\r\n                    [switch] $AsJob,\r\n                    [string] $JobName,\r\n                    [Parameter(ValueFromPipeline=$true)]$InputObject\r\n                    )\r\n", new object[] { builder.ToString() }), out tokenArray, out errorArray).GetScriptBlock();
 }
示例#26
0
            public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
            {
                if (functionDefinitionAst.Extent.ContainsLineAndColumn(_breakpoint.Line, _breakpoint.Column))
                {
                    _result = true;
                    return AstVisitAction.StopVisit;
                }

                // We don't need to visit the body, we're just checking extents of the topmost functions.
                // We'll visit the bodies eventually, but only when the nested function/script is executed.
                return AstVisitAction.SkipChildren;
            }
示例#27
0
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     this.ReportError(functionDefinitionAst, () => ParserStrings.FunctionDeclarationNotSupportedInDataSection, new object[0]);
     return AstVisitAction.Continue;
 }
示例#28
0
 private static ImageListKind GetImageListKind(FunctionDefinitionAst funcDef)
 {
     //TODO: More image kinds here
     return ImageListKind.Method;
 }
示例#29
0
        private static ScriptBlock CreateFakeScriptBlockForWorkflow(FunctionDefinitionAst functionDefinitionAst)
        {
            // The common parameters for a workflow is are always the same, the only difference is what parameters
            // the workflow specifies.  When we generate the wrapper, the users parameters are "tweaked" slightly,
            // but those differences shouldn't matter for Intellisense.  They could for the syntax if we showed it,
            // but the differences are very minor.  See ImportWorkflowCommand.AddCommonWfParameters in
            // admin\monad\src\m3p\product\ServiceCore\WorkflowCore\ImportWorkflowCommand.cs for the actual logic
            // that creates this string.

            const string paramBlock = @"
                [CmdletBinding()]
                {0}
                param (
                    {1}
                    [hashtable[]] $PSParameterCollection,
                    [string[]] $PSComputerName,
                    [ValidateNotNullOrEmpty()] $PSCredential,
                    [uint32] $PSConnectionRetryCount,
                    [uint32] $PSConnectionRetryIntervalSec,
                    [ValidateRange(1, 2147483)][uint32] $PSRunningTimeoutSec,
                    [ValidateRange(1, 2147483)][uint32] $PSElapsedTimeoutSec,
                    [bool] $PSPersist,
                    [ValidateNotNullOrEmpty()] [System.Management.Automation.Runspaces.AuthenticationMechanism] $PSAuthentication,
                    [ValidateNotNullOrEmpty()][System.Management.AuthenticationLevel] $PSAuthenticationLevel,
                    [ValidateNotNullOrEmpty()] [string] $PSApplicationName,
                    [uint32] $PSPort,
                    [switch] $PSUseSSL,
                    [ValidateNotNullOrEmpty()] [string] $PSConfigurationName,
                    [ValidateNotNullOrEmpty()][string[]] $PSConnectionURI,
                    [switch] $PSAllowRedirection,
                    [ValidateNotNullOrEmpty()][System.Management.Automation.Remoting.PSSessionOption] $PSSessionOption,
                    [ValidateNotNullOrEmpty()] [string] $PSCertificateThumbprint,
                    [hashtable] $PSPrivateMetadata,
                    [switch] $AsJob,
                    [string] $JobName,
                    [Parameter(ValueFromPipeline=$true)]$InputObject
                    )
";

            var outputTypeText = new StringBuilder();
            var sb = new StringBuilder();

            var paramBlockAst = functionDefinitionAst.Body.ParamBlock;
            if (paramBlockAst != null)
            {
                var outputTypeAttrs = paramBlockAst.Attributes.Where(attribute => typeof(OutputTypeAttribute).Equals(attribute.TypeName.GetReflectionAttributeType()));

                foreach (AttributeAst attributeAst in outputTypeAttrs)
                {
                    outputTypeText.Append(attributeAst.Extent.Text);
                }
            }

            var parameterAsts = ((IParameterMetadataProvider)functionDefinitionAst).Parameters;
            if (parameterAsts != null)
            {
                var first = true;
                foreach (var parameter in parameterAsts)
                {
                    if (!first) sb.Append(", ");
                    first = false;
                    sb.Append(parameter.Extent.Text);
                }
                if (!first) sb.Append(", ");
            }

            Token[] tokens;
            ParseError[] errors;
            var ast = Parser.ParseInput(string.Format(CultureInfo.InvariantCulture, paramBlock, outputTypeText.ToString(), sb.ToString()), out tokens, out errors);
            return ast.GetScriptBlock();
        }
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return(AstVisitAction.SkipChildren);
 }
示例#31
0
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     _context.SessionState.Function.Set(functionDefinitionAst.Name, functionDefinitionAst.Body.GetScriptBlock());
     return AstVisitAction.SkipChildren;
 }
示例#32
0
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst ast)
 {
     return(CheckParent(ast));
 }
示例#33
0
 public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return null;
 }
示例#34
0
 public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return false;
 }
        /// <summary>
        /// Visit function
        /// </summary>
        /// <param name="functionDefinitionAst"></param>
        /// <returns></returns>
        public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
        {
            // Don't recurse into the function definition, it's variables are distinct from the script block
            // we're currently analyzing.

            return null;
        }
示例#36
0
 public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     throw PSTraceSource.NewArgumentException("ast");
 }
 /// <summary>
 /// Visit Function
 /// </summary>
 /// <param name="functionDefinitionAst"></param>
 /// <returns></returns>
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     // We don't want to discover any variables in nested functions - they get their own scope.
     return AstVisitAction.SkipChildren;
 }
示例#38
0
 public object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return(false);
 }
 /// <summary/>
 public virtual object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     return _decorated.VisitFunctionDefinition(functionDefinitionAst);
 }
        /// <summary>
        /// Visit function and checks that it has comment help
        /// </summary>
        /// <param name="funcAst"></param>
        /// <returns></returns>
        public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst funcAst)
        {
            if (funcAst == null)
            {
                return AstVisitAction.SkipChildren;
            }

            if (exportedFunctions.Contains(funcAst.Name))
            {
                if (funcAst.GetHelpContent() == null)
                {
                    DiagnosticRecords.Add(
                        new DiagnosticRecord(
                            string.Format(CultureInfo.CurrentCulture, Strings.ProvideCommentHelpError, funcAst.Name),
                            funcAst.Extent, GetName(), DiagnosticSeverity.Information, fileName));
                }
            }

            return AstVisitAction.Continue;
        }
示例#41
0
 public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
 {
     ExecutionContext.SessionState.Function.Set(functionDefinitionAst.Name, functionDefinitionAst.Body.GetScriptBlock(),
                                        functionDefinitionAst.Parameters, "");
     return AstVisitAction.SkipChildren;
 }