コード例 #1
0
        private ExpressionAst CheckUsingExpression(ExpressionAst exprAst)
        {
            RuntimeHelpers.EnsureSufficientExecutionStack();
            if (exprAst is VariableExpressionAst)
            {
                return(null);
            }
            MemberExpressionAst ast = exprAst as MemberExpressionAst;

            if (((ast != null) && !(ast is InvokeMemberExpressionAst)) && (ast.Member is StringConstantExpressionAst))
            {
                return(this.CheckUsingExpression(ast.Expression));
            }
            IndexExpressionAst ast2 = exprAst as IndexExpressionAst;

            if (ast2 == null)
            {
                return(exprAst);
            }
            if (!this.IsValidAttributeArgument(ast2.Index))
            {
                return(ast2.Index);
            }
            return(this.CheckUsingExpression(ast2.Target));
        }
コード例 #2
0
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            Type   reflectionType = ((TypeExpressionAst)memberExpressionAst.Expression).TypeName.GetReflectionType();
            string name           = ((StringConstantExpressionAst)memberExpressionAst.Member).Value;

            return(((FieldInfo)reflectionType.GetMember(name, MemberTypes.Field, BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase)[0]).GetValue(null));
        }
コード例 #3
0
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            if (!memberExpressionAst.Static || !(memberExpressionAst.Expression is TypeExpressionAst))
            {
                return(false);
            }

            var type = ((TypeExpressionAst)memberExpressionAst.Expression).TypeName.GetReflectionType();

            if (type == null)
            {
                return(false);
            }

            var member = memberExpressionAst.Member as StringConstantExpressionAst;

            if (member == null)
            {
                return(false);
            }

            var memberInfo = type.GetMember(member.Value, MemberTypes.Field,
                                            BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);

            if (memberInfo.Length != 1)
            {
                return(false);
            }

            return((((FieldInfo)memberInfo[0]).Attributes & FieldAttributes.Literal) != 0);
        }
コード例 #4
0
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            if (!memberExpressionAst.Static || !(memberExpressionAst.Expression is TypeExpressionAst))
            {
                return(false);
            }
            Type reflectionType = ((TypeExpressionAst)memberExpressionAst.Expression).TypeName.GetReflectionType();

            if (reflectionType == null)
            {
                return(false);
            }
            StringConstantExpressionAst member = memberExpressionAst.Member as StringConstantExpressionAst;

            if (member == null)
            {
                return(false);
            }
            MemberInfo[] infoArray = reflectionType.GetMember(member.Value, MemberTypes.Field, BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase);
            if (infoArray.Length != 1)
            {
                return(false);
            }
            return((((FieldInfo)infoArray[0]).Attributes & FieldAttributes.Literal) != FieldAttributes.PrivateScope);
        }
コード例 #5
0
ファイル: SourceMapper.cs プロジェクト: gpduck/ScriptMap
    public System.Object VisitMemberExpression(System.Management.Automation.Language.MemberExpressionAst memberExpressionAst)
    {
        IScriptExtent mappedExtent = MapExtent(memberExpressionAst.Extent);

        ExpressionAst     mappedExpression = _VisitExpression(memberExpressionAst.Expression);
        CommandElementAst mappedMember     = _VisitCommandElement(memberExpressionAst.Member);

        return(new MemberExpressionAst(mappedExtent, mappedExpression, mappedMember, memberExpressionAst.Static));
    }
コード例 #6
0
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            CheckIsConstant(memberExpressionAst, "Caller to verify ast is constant");

            var type       = ((TypeExpressionAst)memberExpressionAst.Expression).TypeName.GetReflectionType();
            var member     = ((StringConstantExpressionAst)memberExpressionAst.Member).Value;
            var memberInfo = type.GetMember(member, MemberTypes.Field,
                                            BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);

            return(((FieldInfo)memberInfo[0]).GetValue(null));
        }
コード例 #7
0
        private static VariableExpressionAst ExtractUsingVariableImpl(ExpressionAst expression)
        {
            VariableExpressionAst subExpression;
            UsingExpressionAst    ast = expression as UsingExpressionAst;

            if (ast != null)
            {
                subExpression = ast.SubExpression as VariableExpressionAst;
                if (subExpression != null)
                {
                    return(subExpression);
                }
                return(ExtractUsingVariableImpl(ast.SubExpression));
            }
            IndexExpressionAst ast3 = expression as IndexExpressionAst;

            if (ast3 != null)
            {
                subExpression = ast3.Target as VariableExpressionAst;
                if (subExpression != null)
                {
                    return(subExpression);
                }
                return(ExtractUsingVariableImpl(ast3.Target));
            }
            MemberExpressionAst ast4 = expression as MemberExpressionAst;

            if (ast4 == null)
            {
                return(null);
            }
            subExpression = ast4.Expression as VariableExpressionAst;
            if (subExpression != null)
            {
                return(subExpression);
            }
            return(ExtractUsingVariableImpl(ast4.Expression));
        }
コード例 #8
0
ファイル: ExecutionVisitor.cs プロジェクト: Ventero/Pash
 private void SetMemberExpressionValue(MemberExpressionAst memberExpressionAst, object value)
 {
     string memberName;
     var psobj = EvaluateAsPSObject(memberExpressionAst.Expression);
     var unwraped = PSObject.Unwrap(psobj);
     var memberNameObj = EvaluateAst(memberExpressionAst.Member, false);
     // check for Hashtable first
     if (unwraped is Hashtable && memberNameObj != null &&
         !_hashtableAccessibleMembers.Contains(memberNameObj.ToString()))
     {
         ((Hashtable) unwraped)[memberNameObj] = value;
         return;
     }
     // else it's a PSObject
     var member = GetPSObjectMember(psobj, memberNameObj, memberExpressionAst.Static, out memberName);
     if (member == null)
     {
         throw new PSArgumentNullException(String.Format("Member '{0}' to be assigned is null", memberName));
     }
     member.Value = value;
 }
コード例 #9
0
ファイル: AstVisitor.cs プロジェクト: JamesTryand/Pash2
 public virtual AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return AstVisitAction.Continue;
 }
コード例 #10
0
ファイル: ExecutionVisitor.cs プロジェクト: stangelandcl/Pash
        public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var expression = memberExpressionAst.Expression;

            ObjectInfo objectInfo = GetObjectInfo(expression);

            if (memberExpressionAst.Member is StringConstantExpressionAst)
            {
                object result = null;
                var name = (memberExpressionAst.Member as StringConstantExpressionAst).Value;

                var memberInfo = objectInfo.GetMember(name, memberExpressionAst.Static);

                if (memberInfo != null)
                {
                    switch (memberInfo.MemberType)
                    {
                        case MemberTypes.Field:
                            result = ((FieldInfo)memberInfo).GetValue(objectInfo.Object);
                            break;

                        case MemberTypes.Property:
                            result = ((PropertyInfo)memberInfo).GetValue(objectInfo.Object, null);
                            break;

                        default:
                            throw new NotImplementedException(this.ToString());
                    }
                }

                _pipelineCommandRuntime.WriteObject(result);
                return AstVisitAction.SkipChildren;
            }

            throw new NotImplementedException(this.ToString());
        }
コード例 #11
0
ファイル: SemanticChecks.cs プロジェクト: dfinke/powershell
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     CheckMemberAccess(memberExpressionAst);
     return AstVisitAction.Continue;
 }
コード例 #12
0
 /// <summary/>
 public virtual object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return _decorated.VisitMemberExpression(memberExpressionAst);
 }
コード例 #13
0
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     throw new UnexpectedElementException();
 }
コード例 #14
0
 internal SettableMemberExpression(MemberExpressionAst expressionAst, ExecutionVisitor currentExecution)
     : base(currentExecution)
 {
     _expressionAst = expressionAst;
 }
コード例 #15
0
ファイル: ConstantValues.cs プロジェクト: 40a/PowerShell
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            CheckIsConstant(memberExpressionAst, "Caller to verify ast is constant");

            var type = ((TypeExpressionAst)memberExpressionAst.Expression).TypeName.GetReflectionType();
            var member = ((StringConstantExpressionAst)memberExpressionAst.Member).Value;
            var memberInfo = type.GetMember(member, MemberTypes.Field,
                BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
            return ((FieldInfo)memberInfo[0]).GetValue(null);
        }
コード例 #16
0
ファイル: ConstantValues.cs プロジェクト: 40a/PowerShell
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            if (!memberExpressionAst.Static || !(memberExpressionAst.Expression is TypeExpressionAst))
            {
                return false;
            }

            var type = ((TypeExpressionAst)memberExpressionAst.Expression).TypeName.GetReflectionType();
            if (type == null)
            {
                return false;
            }

            var member = memberExpressionAst.Member as StringConstantExpressionAst;
            if (member == null)
            {
                return false;
            }

            var memberInfo = type.GetMember(member.Value, MemberTypes.Field,
                BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
            if (memberInfo.Length != 1)
            {
                return false;
            }

            return (((FieldInfo)memberInfo[0]).Attributes & FieldAttributes.Literal) != 0;
        }
コード例 #17
0
ファイル: ExecutionVisitor.cs プロジェクト: staxmanade/Pash
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     throw new NotImplementedException(); //VisitMemberExpression(memberExpressionAst);
 }
コード例 #18
0
ファイル: SafeExprEvaluator.cs プロジェクト: nickchal/pash
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return (!((bool) memberExpressionAst.Expression.Accept(this)) ? ((object) 0) : ((object) ((bool) memberExpressionAst.Member.Accept(this))));
 }
コード例 #19
0
ファイル: AstSearcher.cs プロジェクト: nickchal/pash
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst ast)
 {
     return this.Check(ast);
 }
コード例 #20
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     this.ReportError(memberExpressionAst, () => ParserStrings.PropertyReferenceNotSupportedInDataSection, new object[0]);
     return(AstVisitAction.Continue);
 }
コード例 #21
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst ast)
 {
     return(Check(ast));
 }
コード例 #22
0
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return(false);
 }
コード例 #23
0
ファイル: SafeValues.cs プロジェクト: 40a/PowerShell
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return false;
 }
コード例 #24
0
 /// <summary/>
 public virtual AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst) => DefaultVisit(memberExpressionAst);
コード例 #25
0
ファイル: SafeValues.cs プロジェクト: 40a/PowerShell
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     throw PSTraceSource.NewArgumentException("ast");
 }
コード例 #26
0
 /// <summary>
 /// Visit Member Expression
 /// </summary>
 /// <param name="memberExpressionAst"></param>
 /// <returns></returns>
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     if (memberExpressionAst == null) return null;
     memberExpressionAst.Expression.Visit(this.Decorator);
     memberExpressionAst.Member.Visit(this.Decorator);
     return null;
 }
コード例 #27
0
ファイル: Compiler.cs プロジェクト: 40a/PowerShell
        public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            // Getting a static member is much simpler because we can ignore instance
            // and type table members and we only have one adapter - .Net.  So we'll
            // avoid a dynamic expression if possible.
            if (memberExpressionAst.Static && (memberExpressionAst.Expression is TypeExpressionAst))
            {
                var type = ((TypeExpressionAst)memberExpressionAst.Expression).TypeName.GetReflectionType();
                if (type != null && !type.GetTypeInfo().IsGenericTypeDefinition)
                {
                    var member = memberExpressionAst.Member as StringConstantExpressionAst;
                    if (member != null)
                    {
                        // We skip Methods because the adapter wraps them in a PSMethod and it's not a common scenario.
                        var memberInfo = type.GetMember(member.Value, MemberTypes.Field | MemberTypes.Property,
                            BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static |
                            BindingFlags.FlattenHierarchy);
                        if (memberInfo.Length == 1)
                        {
                            var propertyInfo = memberInfo[0] as PropertyInfo;
                            if (propertyInfo != null)
                            {
                                if (propertyInfo.CanRead)
                                {
                                    return Expression.Property(null, propertyInfo);
                                }
                                // else let the dynamic site generate the error - this is rare anyway
                            }
                            else
                            {
                                return Expression.Field(null, (FieldInfo)memberInfo[0]);
                            }
                        }
                    }
                }
            }

            var target = CompileExpressionOperand(memberExpressionAst.Expression);
            var memberNameAst = memberExpressionAst.Member as StringConstantExpressionAst;
            if (memberNameAst != null)
            {
                string name = memberNameAst.Value;
                return DynamicExpression.Dynamic(PSGetMemberBinder.Get(name, _memberFunctionType, memberExpressionAst.Static), typeof(object), target);
            }

            var memberNameExpr = Compile(memberExpressionAst.Member);
            return DynamicExpression.Dynamic(PSGetDynamicMemberBinder.Get(_memberFunctionType, memberExpressionAst.Static), typeof(object), target, memberNameExpr);
        }
コード例 #28
0
ファイル: ExecutionVisitor.cs プロジェクト: mauve/Pash
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     _pipelineCommandRuntime.WriteObject(new SettableMemberExpression(memberExpressionAst, this).GetValue());
     return AstVisitAction.SkipChildren;
 }
コード例 #29
0
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     this.ReportError(memberExpressionAst, () => ParserStrings.PropertyReferenceNotSupportedInDataSection, new object[0]);
     return AstVisitAction.Continue;
 }
コード例 #30
0
ファイル: ExecutionVisitor.cs プロジェクト: Ventero/Pash
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     string memberName;
     var psobj = EvaluateAsPSObject(memberExpressionAst.Expression);
     var unwraped = PSObject.Unwrap(psobj);
     var memberNameObj = EvaluateAst(memberExpressionAst.Member, false);
     // check for Hastable first
     if (unwraped is Hashtable && memberNameObj != null &&
         !_hashtableAccessibleMembers.Contains(memberNameObj.ToString()))
     {
         var hashtable = (Hashtable)unwraped;
         _pipelineCommandRuntime.WriteObject(hashtable[memberNameObj]);
     }
     else // otherwise a PSObject
     {
         var member = GetPSObjectMember(psobj, memberNameObj, memberExpressionAst.Static, out memberName);
         var value = (member == null) ? null : PSObject.AsPSObject(member.Value);
         _pipelineCommandRuntime.WriteObject(value);
     }
     return AstVisitAction.SkipChildren;
 }
コード例 #31
0
ファイル: ExecutionVisitor.cs プロジェクト: prateek/Pash
 private PSMemberInfo GetPSObjectMemberFromMemberExpression(MemberExpressionAst memberExpressionAst, out string memberName)
 {
     var psobj = EvaluateAsPSObject(memberExpressionAst.Expression);
     var memberNameObj = EvaluateAst(memberExpressionAst.Member, false);
     if (memberNameObj == null)
     {
         throw new PSArgumentNullException("Member name evaluates to null");
     }
     memberName = memberNameObj.ToString();
     if (memberExpressionAst.Static)
     {
         return psobj.StaticMembers[memberName];
     }
     return psobj.Members[memberName];
 }
コード例 #32
0
ファイル: ExecutionVisitor.cs プロジェクト: JayBazuzi/Pash
        public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
        {
            var expression = memberExpressionAst.Expression;

            Type type;
            object obj;
            if (expression is TypeExpressionAst)
            {
                obj = null;
                type = ((TypeExpressionAst)expression).TypeName.GetReflectionType();
            }
            else
            {
                obj = EvaluateAst(expression);
                if (obj is PSObject)
                {
                    obj = ((PSObject)obj).BaseObject;
                }
                type = obj.GetType();
            }

            if (memberExpressionAst.Member is StringConstantExpressionAst)
            {
                object result = null;
                var name = (memberExpressionAst.Member as StringConstantExpressionAst).Value;

                BindingFlags bindingFlags = BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;

                // TODO: Single() is a problem for overloaded methods
                var memberInfo = type.GetMember(name, bindingFlags).Single();

                if (memberInfo != null)
                {
                    switch (memberInfo.MemberType)
                    {
                        case MemberTypes.Field:
                            result = ((FieldInfo)memberInfo).GetValue(obj);
                            break;

                        case MemberTypes.Property:
                            result = ((PropertyInfo)memberInfo).GetValue(obj, null);
                            break;

                        default:
                            throw new NotImplementedException(this.ToString());
                    }
                }

                _pipelineCommandRuntime.WriteObject(result);
                return AstVisitAction.SkipChildren;
            }

            throw new NotImplementedException(this.ToString());
        }
コード例 #33
0
ファイル: ExecutionVisitor.cs プロジェクト: prateek/Pash
 private void SetMemberExpressionValue(MemberExpressionAst memberExpressionAst, object value)
 {
     string memberName;
     var member = GetPSObjectMemberFromMemberExpression(memberExpressionAst, out memberName);
     if (member == null)
     {
         throw new PSArgumentNullException(String.Format("Member '{0}' to be assigned is null", memberName));
     }
     member.Value = value;
 }
コード例 #34
0
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     memberExpressionAst.Expression.Accept(this);
     memberExpressionAst.Member.Accept(this);
     return(null);
 }
コード例 #35
0
ファイル: ExecutionVisitor.cs プロジェクト: prateek/Pash
 public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     string memberName;
     var member = GetPSObjectMemberFromMemberExpression(memberExpressionAst, out memberName);
     var value = PSObject.AsPSObject((member == null) ? null : member.Value);
     _pipelineCommandRuntime.WriteObject(value);
     return AstVisitAction.SkipChildren;
 }
コード例 #36
0
 /// <summary/>
 public virtual object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return(null);
 }
コード例 #37
0
ファイル: VariableAnalysis.cs プロジェクト: nickchal/pash
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     memberExpressionAst.Expression.Accept(this);
     memberExpressionAst.Member.Accept(this);
     return null;
 }
コード例 #38
0
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     if (!memberExpressionAst.Static || !(memberExpressionAst.Expression is TypeExpressionAst))
     {
         return false;
     }
     Type reflectionType = ((TypeExpressionAst) memberExpressionAst.Expression).TypeName.GetReflectionType();
     if (reflectionType == null)
     {
         return false;
     }
     StringConstantExpressionAst member = memberExpressionAst.Member as StringConstantExpressionAst;
     if (member == null)
     {
         return false;
     }
     MemberInfo[] infoArray = reflectionType.GetMember(member.Value, MemberTypes.Field, BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase);
     if (infoArray.Length != 1)
     {
         return false;
     }
     return ((((FieldInfo) infoArray[0]).Attributes & FieldAttributes.Literal) != FieldAttributes.PrivateScope);
 }
コード例 #39
0
        internal static Type GetTypeFromMemberExpressionAst(MemberExpressionAst memAst, VariableAnalysisDetails analysis, TypeDefinitionAst psClass)

        #endif        
        {
            if (memAst != null && memAst.Expression is VariableExpressionAst && memAst.Member is StringConstantExpressionAst
                && !String.Equals((memAst.Expression as VariableExpressionAst).VariablePath.UserPath, "this", StringComparison.OrdinalIgnoreCase))
            {
                string fieldName = (memAst.Member as StringConstantExpressionAst).Value;

                #if !PSV3

                if (psClass == null && analysis.Constant == SpecialVars.ThisVariable)
                {
                    psClass = AssignmentTarget.FindClassAncestor(memAst);
                }

                if (psClass != null)
                {
                    Type typeFromClass = AssignmentTarget.GetTypeFromClass(psClass, memAst);
                    {
                        if (typeFromClass != null)
                        {
                            return typeFromClass;
                        }
                    }
                }

                #endif

                // If the type is not a ps class or there are some types of the same name.
                if (analysis != null && analysis.Type != null && analysis.Type != typeof(object)
                    && analysis.Type != typeof(Unreached) && analysis.Type != typeof(Undetermined))
                {
                    if (memAst is InvokeMemberExpressionAst)
                    {
                        return AssignmentTarget.GetTypeFromInvokeMemberAst(analysis.Type, memAst as InvokeMemberExpressionAst, fieldName, false);
                    }
                    else
                    {
                        return AssignmentTarget.GetPropertyOrFieldTypeFromMemberExpressionAst(analysis.Type, fieldName);
                    }
                }
            }

            return null;
        }
コード例 #40
0
 public object VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     throw PSTraceSource.NewArgumentException("ast");
 }
コード例 #41
0
        /// <summary>
        /// Given a memberAst, try to return the type of the expression. This assumes that the memberAst is of the form
        /// [Type]::method/field or $this.method/field
        /// </summary>
        /// <param name="memberAst"></param>
        /// <returns></returns>
        internal static Type GetTypeFromMemberExpressionAst(MemberExpressionAst memberAst)
        {
            Type result = null;

            StringConstantExpressionAst stringAst = memberAst.Member as StringConstantExpressionAst;

            if (stringAst == null)
            {
                return result;
            }

            if (memberAst is InvokeMemberExpressionAst)
            {
                #region RHS is InvokeMemberExpressionAst

                InvokeMemberExpressionAst imeAst = memberAst as InvokeMemberExpressionAst;
                if (imeAst.Expression is TypeExpressionAst)
                {
                    string methodName = stringAst.Value;
                    Type type = (imeAst.Expression as TypeExpressionAst).TypeName.GetReflectionType();

                    if (String.Equals(methodName, "new", StringComparison.OrdinalIgnoreCase))
                    {
                        result = type;
                    }
                    else if (type != null && type != typeof(object))
                    {
                        // isStatic is true
                        result = GetTypeFromInvokeMemberAst(type, imeAst, methodName, true);
                    }
                    #if !PSV3
                    else
                    {
                        // Check for classes
                        TypeDefinitionAst psClass = FindClass(memberAst, (imeAst.Expression as TypeExpressionAst).TypeName.FullName);

                        if (psClass != null)
                        {
                            MemberAst funcMemberAst = psClass.Members.FirstOrDefault(item =>
                                item is FunctionMemberAst && (item as FunctionMemberAst).IsStatic
                                && String.Equals(item.Name, methodName, StringComparison.OrdinalIgnoreCase));

                            if (funcMemberAst != null)
                            {
                                result = (funcMemberAst as FunctionMemberAst).ReturnType.TypeName.GetReflectionType();
                            }
                        }
                    }
                    #endif
                }

                #endregion
            }
            else
            {
                #region RHS is MemberExpressionAst

                //syntax like $a=[System.AppDomain]::CurrentDomain
                string fieldName = stringAst.Value;

                if (memberAst.Expression is TypeExpressionAst)
                {
                    Type expressionType = (memberAst.Expression is TypeExpressionAst) ? (memberAst.Expression as TypeExpressionAst).TypeName.GetReflectionType() : null;

                    if (expressionType != null)
                    {
                        result = GetPropertyOrFieldTypeFromMemberExpressionAst(expressionType, fieldName);
                    }
                    #if !PSV3
                    else
                    {
                        // check for class type
                        TypeDefinitionAst psClass = FindClass(memberAst, (memberAst.Expression as TypeExpressionAst).TypeName.FullName);

                        if (psClass != null)
                        {
                            MemberAst memAst = psClass.Members.FirstOrDefault(item => String.Equals(item.Name, fieldName, StringComparison.OrdinalIgnoreCase));

                            if (memAst != null && memAst is PropertyMemberAst && (memAst as PropertyMemberAst).IsStatic)
                            {
                                result = (memAst as PropertyMemberAst).PropertyType.TypeName.GetReflectionType();
                            }
                        }
                    }
                    #endif
                }

                #endregion
            }

            if (result != null)
            {
                return result;
            }

            #region RHS contains $this variable

            // For the case where variable is $this
            if (memberAst.Expression is VariableExpressionAst
                && String.Equals((memberAst.Expression as VariableExpressionAst).VariablePath.UserPath, "this", StringComparison.OrdinalIgnoreCase))
            {
                #if !PSV3

                // Check that we are in a class
                TypeDefinitionAst psClass = FindClassAncestor(memberAst);

                // Is static is false for this case
                result = GetTypeFromClass(psClass, memberAst);

                #endif
            }

            return result;
            #endregion
        }
コード例 #42
0
 /// <summary/>
 public virtual AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
 {
     return(AstVisitAction.Continue);
 }
コード例 #43
0
        /// <summary>
        /// Get the type for memberexpressionast assuming that the variable is a class
        /// </summary>
        /// <param name="psClass"></param>
        /// <param name="memberExpressionAst"></param>
        /// <returns></returns>
        internal static Type GetTypeFromClass(TypeDefinitionAst psClass, MemberExpressionAst memberExpressionAst)
        {
            Type result = null;

            if (psClass != null)
            {
                MemberAst memAst = psClass.Members.FirstOrDefault(item => String.Equals(item.Name, (memberExpressionAst.Member as StringConstantExpressionAst).Value, StringComparison.OrdinalIgnoreCase));

                if (memAst != null)
                {
                    if (memAst is PropertyMemberAst)
                    {
                        result = (memAst as PropertyMemberAst).PropertyType.TypeName.GetReflectionType();
                    }
                    else if (memAst is FunctionMemberAst)
                    {
                        result = (memAst as FunctionMemberAst).ReturnType.TypeName.GetReflectionType();
                    }
                }
            }

            return result;
        }
コード例 #44
0
        /// <summary>
        /// Get the type from member expression ast in the form of $variable.field/method
        /// type is the type of variable. Class is the class that matches the type
        /// </summary>
        /// <param name="analysis"></param>
        /// <param name="memAst"></param>
        /// <param name="psClass"></param>
        /// <returns></returns>
        
        #if PSV3

        internal static Type GetTypeFromMemberExpressionAst(MemberExpressionAst memAst, VariableAnalysisDetails analysis)
コード例 #45
0
ファイル: SemanticChecks.cs プロジェクト: dfinke/powershell
        private void CheckMemberAccess(MemberExpressionAst ast)
        {
            // If the member access is not constant, it may be considered suspicious
            if (!(ast.Member is ConstantExpressionAst))
            {
                MarkAstParentsAsSuspicious(ast);
            }

            TypeExpressionAst typeExpression = ast.Expression as TypeExpressionAst;

            // If this is static access on a variable, it may be suspicious
            if (ast.Static && (typeExpression == null))
            {
                MarkAstParentsAsSuspicious(ast);
            }
        }