예제 #1
0
        public override void VisitMethodReferenceExpression(IMethodReferenceExpression operation)
        {
            var member = operation.Member;
            var method = operation.Method;

            base.VisitMethodReferenceExpression(operation);
        }
예제 #2
0
        public ISimpleStatement CallMethod(IMethodReferenceExpression method, params IExpression[] arguments)
        {
            ISimpleStatement simpleStatement = new SimpleStatement(method.Invoke(arguments), this);

            this.Add(simpleStatement);
            return(simpleStatement);
        }
        /// <summary>
        /// Get expression type
        /// </summary>
        public override Type GetExpressionType()
        {
            IMethodReferenceExpression imre = this.Method;

            if (imre != null)
            {
                MethodInfo mi = (MethodInfo)imre.Method.MethodInfo;
                return(mi.ReturnType);
            }
            return(null);
        }
예제 #4
0
        public object Invoke(IMethodReferenceExpression imre, object[] args)
        {
            object target = null;

            if (!(imre.Target is ITypeReferenceExpression))
            {
                target = Evaluate(imre.Target);
            }
            MethodBase mb = Builder.ToMethod(imre.Method);

            return(Util.Invoke(mb, target, args));
        }
예제 #5
0
        public override bool Equals(object obj)
        {
            if (this == obj)
            {
                return(true);
            }

            IMethodReferenceExpression expression = obj as IMethodReferenceExpression;

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

            return
                (Method.Equals(expression.Method) &&
                 Target.Equals(expression.Target));
        }
예제 #6
0
        public override void VisitMethodReferenceExpression(IMethodReferenceExpression value)
        {
            bool hasThis = !value.Method.HasThis;

            if (value.Target is IBinaryExpression)
            {
                _formatter.Write("(");
                VisitExpression(value.Target);
                _formatter.Write(")");
            }
            else if (hasThis)
            {
                _formatter.Write("[");
                VisitExpression(value.Target);
                _formatter.Write("]");
            }
            else
            {
                VisitExpression(value.Target);
            }

            _formatter.Write(hasThis ? "::" : ".");
            VisitMethodReference(value.Method);
        }
예제 #7
0
            //===========================================================
            //		Expression 分岐
            //===========================================================
            public virtual void WriteExpression(IExpression expression)
            {
                if (expression == null)
                {
                    return;
                }

                mwg.Reflector.CppCli.ExpressionWriter.WriteExpression(this, expression, false);

#if FALSE
#pragma warning disable 612

                IMemberInitializerExpression expression3 = expression as IMemberInitializerExpression;
                if (expression3 != null)
                {
                    this.WriteMemberInitializerExpression(expression3);
                    return;
                }

                IAddressOutExpression expression27 = expression as IAddressOutExpression;
                if (expression27 != null)
                {
                    this.WriteAddressOutExpression(expression27);
                    return;
                }

                IAddressReferenceExpression expression26 = expression as IAddressReferenceExpression;
                if (expression26 != null)
                {
                    this.WriteAddressReferenceExpression(expression26);
                    return;
                }

                IDelegateCreateExpression iDelegateCreateExpression = expression as IDelegateCreateExpression;
                if (iDelegateCreateExpression != null)
                {
                    this.WriteDelegateCreateExpression(iDelegateCreateExpression);
                    return;
                }

                IMethodInvokeExpression iMethodInvokeExpression = expression as IMethodInvokeExpression;
                if (iMethodInvokeExpression != null)
                {
                    this.WriteMethodInvokeExpression(iMethodInvokeExpression);
                    return;
                }

                IVariableDeclarationExpression expression15 = expression as IVariableDeclarationExpression;
                if (expression15 != null)
                {
                    this.WriteVariableDeclaration(expression15.Variable);
                    return;
                }

                ITypeOfExpression iTypeOfExpression = expression as ITypeOfExpression;
                if (iTypeOfExpression != null)
                {
                    this.WriteTypeOfExpression(iTypeOfExpression);
                    return;
                }

                ISnippetExpression iSnippetExpression = expression as ISnippetExpression;
                if (iSnippetExpression != null)
                {
                    this.WriteSnippetExpression(iSnippetExpression);
                    return;
                }

                IUnaryExpression iUnaryExpression = expression as IUnaryExpression;
                if (iUnaryExpression != null)
                {
                    this.WriteUnaryExpression(iUnaryExpression);
                    return;
                }

                IObjectCreateExpression iObjectCreateExpression = expression as IObjectCreateExpression;
                if (iObjectCreateExpression != null)
                {
                    this.WriteObjectCreateExpression(iObjectCreateExpression);
                    return;
                }

                IVariableReferenceExpression iVariableReferenceExpression = expression as IVariableReferenceExpression;
                if (iVariableReferenceExpression != null)
                {
                    this.WriteVariableReferenceExpression(iVariableReferenceExpression);
                    return;
                }

                IThisReferenceExpression expression12 = expression as IThisReferenceExpression;
                if (expression12 != null)
                {
                    this.WriteThisReferenceExpression(expression12);
                    return;
                }

                ITryCastExpression iTryCastExpression = expression as ITryCastExpression;
                if (iTryCastExpression != null)
                {
                    this.WriteTryCastExpression(iTryCastExpression);
                    return;
                }

                IConditionExpression expression9 = expression as IConditionExpression;
                if (expression9 != null)
                {
                    this.WriteConditionExpression(expression9);
                    return;
                }

                IFieldReferenceExpression iFieldReferenceExpression = expression as IFieldReferenceExpression;
                if (iFieldReferenceExpression != null)
                {
                    this.WriteFieldReferenceExpression(iFieldReferenceExpression);
                    return;
                }

                IPropertyIndexerExpression iPropertyIndexerExpression = expression as IPropertyIndexerExpression;
                if (iPropertyIndexerExpression != null)
                {
                    this.WritePropertyIndexerExpression(iPropertyIndexerExpression);
                    return;
                }

                ITypeReferenceExpression iTypeReferenceExpression = expression as ITypeReferenceExpression;
                if (iTypeReferenceExpression != null)
                {
                    this.WriteTypeReferenceExpression(iTypeReferenceExpression);
                    return;
                }

                IMethodReferenceExpression iMethodReferenceExpression = expression as IMethodReferenceExpression;
                if (iMethodReferenceExpression != null)
                {
                    this.WriteMethodReferenceExpression(iMethodReferenceExpression);
                    return;
                }

                IPropertyReferenceExpression iPropertyReferenceExpression = expression as IPropertyReferenceExpression;
                if (iPropertyReferenceExpression != null)
                {
                    this.WritePropertyReferenceExpression(iPropertyReferenceExpression);
                    return;
                }

                ICastExpression expression5 = expression as ICastExpression;
                if (expression5 != null)
                {
                    this.WriteCastExpression(expression5);
                    return;
                }

                ICanCastExpression iCanCastExpression = expression as ICanCastExpression;
                if (iCanCastExpression != null)
                {
                    this.WriteCanCastExpression(iCanCastExpression);
                    return;
                }

                ICastExpression iCastExpression = expression as ICastExpression;
                if (iCastExpression != null)
                {
                    this.WriteCastExpression(iCastExpression);
                    return;
                }

                ILiteralExpression literalExpression = expression as ILiteralExpression;
                if (literalExpression != null)
                {
                    this.WriteLiteralExpression(literalExpression);
                    return;
                }

                IBinaryExpression iBinaryExpression = expression as IBinaryExpression;
                if (iBinaryExpression != null)
                {
                    mwg.Reflector.CppCli.ExpressionWriter.WriteExpression(this, expression, true);
                    //this.WriteBinaryExpression(iBinaryExpression);
                    return;
                }

                IArrayIndexerExpression expression30 = expression as IArrayIndexerExpression;
                if (expression30 != null)
                {
                    this.WriteArrayIndexerExpression(expression30);
                    return;
                }

                IAddressDereferenceExpression expression29 = expression as IAddressDereferenceExpression;
                if (expression29 != null)
                {
                    this.WriteAddressDereferenceExpression(expression29);
                    return;
                }

                IAddressOfExpression expression28 = expression as IAddressOfExpression;
                if (expression28 != null)
                {
                    this.WriteAddressOfExpression(expression28);
                    return;
                }

                IArgumentListExpression expression25 = expression as IArgumentListExpression;
                if (expression25 != null)
                {
                    this.WriteArgumentListExpression(expression25);
                    return;
                }

                IBaseReferenceExpression iBaseReferenceExpression = expression as IBaseReferenceExpression;
                if (iBaseReferenceExpression != null)
                {
                    this.WriteBaseReferenceExpression(iBaseReferenceExpression);
                    return;
                }

                IArgumentReferenceExpression expression13 = expression as IArgumentReferenceExpression;
                if (expression13 != null)
                {
                    this.WriteArgumentReferenceExpression(expression13);
                    return;
                }

                IArrayCreateExpression expression10 = expression as IArrayCreateExpression;
                if (expression10 != null)
                {
                    this.WriteArrayCreateExpression(expression10);
                    return;
                }

                IAssignExpression iAssignExpression = expression as IAssignExpression;
                if (iAssignExpression != null)
                {
                    this.WriteAssignExpression(iAssignExpression);
                    return;
                }

                IBlockExpression expression2 = expression as IBlockExpression;
                if (expression2 != null)
                {
                    this.WriteBlockExpression(expression2);
                    return;
                }
#pragma warning restore 612

                this.Write(expression.ToString());
#endif
            }
예제 #8
0
 public virtual void VisitMethodReferenceExpression(IMethodReferenceExpression value)
 {
     VisitExpression(value.Target);
 }
예제 #9
0
        private static void WriteTryCatchFinally_try(LanguageWriter w, IBlockStatement _try)         //,int skipCount
        {
#if FUNC_TRY
            if (skipCount == 0)
            {
#endif
            w.WriteKeyword("try");
            w.Write(" {");
            w.WriteLine();
            w.WriteIndent();
#if FUNC_TRY
        }
#endif
            //
            //	try の中身
            //
            if (_try != null)
            {
#if EXTRA_TEMP
                IStatementCollection statementCollection = _try.Statements;
                int i = 0;
                foreach (IStatement state in _try.Statements)
                {
#warning try: 何故スキップが入るのか?
                    // →コンストラクタ内で  を全て delegation したから。
                    // ・delegation の検索は、最初に delegation が適用出来ない物が出た時に終了する
                    //   但し、その際に、ローカル変数 T var=xxx は無視している?
                    // ・最後の delegation が skipCount
                    if (i < skipCount)
                    {
                        i++;

                        IExpressionStatement state_exp = state as IExpressionStatement;
                        if (state_exp == null)
                        {
                            goto write;
                        }

                        IAssignExpression exp_assign = state_exp.Expression as IAssignExpression;
                        if (exp_assign != null)
                        {
                            // this 以外の物の field もスキップされてしまう...
                            if (exp_assign.Target is IFieldReferenceExpression)
                            {
                                continue;
                            }
                            goto write;
                        }

                        IMethodInvokeExpression exp_inv = state_exp.Expression as IMethodInvokeExpression;
                        if (exp_inv != null)
                        {
                            IMethodReferenceExpression method = exp_inv.Method as IMethodReferenceExpression;
                            if (method != null && method.Target is IBaseReferenceExpression)
                            {
                                continue;
                            }
                            goto write;
                        }
                    }
write:
                    WriteStatement(w, state);
                }
#else
                WriteBlock(w, _try);
#endif
            }
            w.WriteOutdent();
            w.Write("}");
        }
예제 #10
0
 public virtual void VisitMethodReferenceExpression(IMethodReferenceExpression value)
 {
     this.VisitExpression(value.Target);
 }
예제 #11
0
 public CallExpression(IMethodReferenceExpression method)
 {
     Method = method;
 }
            private void WriteMethodReferenceExpression(IMethodReferenceExpression expression, IFormatter formatter)
            {
                // TODO bool escape = true;
                if (expression.Target != null)
                { // TODO escape = false;
                    if (expression.Target is IBinaryExpression)
                    {
                        formatter.Write("(");
                        this.WriteExpression(expression.Target, formatter);
                        formatter.Write(")");
                    }
                    else
                    {
                        //formatter.WriteComment("/* " + expression.Target.GetType() + " */");
                        this.WriteTargetExpression(expression.Target, formatter);
                    }

                    formatter.Write(".");

                }
                this.WriteMethodReference(expression.Method, formatter);
            }
예제 #13
0
 public ISimpleStatement CallMethod(IMethodReferenceExpression method, params IExpression[] arguments)
 {
     return(this.Statements.CallMethod(method, arguments));
 }
예제 #14
0
 public abstract void TranslateExpression(IMethodReferenceExpression methodRefExpression);
예제 #15
0
        public static bool IsCatchAllClause(ref IStatementCollection statements)
        {
            if (statements == null || statements.Count != 3)
            {
                return(false);
            }

            /* uint num1=0;*/ {
                IAssignExpression exp_assign = GetAssignExpression(statements[0]);
                if (exp_assign == null || null == GetVariableName(exp_assign.Target, "System", "UInt32"))
                {
                    return(false);
                }
                ILiteralExpression exp_lit = exp_assign.Expression as ILiteralExpression;
                if (exp_lit == null || (uint)exp_lit.Value != 0u)
                {
                    return(false);
                }
            }

            // 以下の二通りの場合がある (他にもあるかも知れない)
            // (1) int num2=::__CxxRegisterExceptionObject((void*)Marshal::GetExceptionPointers(),(void*)num0);
            // (2) ::__CxxRegisterExceptionObject((void*)Marshal::GetExceptionPointers(),(void*)num0);
            // 更に __Cxx の部分は ___Cxx だったりもする
            {
                IExpressionStatement exp_state = statements[1] as IExpressionStatement;
                if (exp_state == null)
                {
                    return(false);
                }

                IMethodInvokeExpression exp_inv;
                IAssignExpression       exp_assign = exp_state.Expression as IAssignExpression;
                if (exp_assign != null)
                {
                    // (1) に挑戦
                    if (null == GetVariableName(exp_assign.Target, "System", "Int32"))
                    {
                        return(false);
                    }
                    exp_inv = exp_assign.Expression as IMethodInvokeExpression;
                }
                else
                {
                    // (2) に挑戦
                    exp_inv = exp_state.Expression as IMethodInvokeExpression;
                }

                if (exp_inv == null || exp_inv.Arguments.Count != 2)
                {
                    return(false);
                }
                IMethodReferenceExpression exp_mref = exp_inv.Method as IMethodReferenceExpression;
                if (exp_mref == null || exp_mref.Method == null || exp_mref.Method.Name.TrimStart('_') != "CxxRegisterExceptionObject")
                {
                    return(false);
                }
            }

            //	try{
            //		try{
            //		}catch when{}
            //		break;
            //		if(num!=0u)throw;
            //	}finally{
            //		::__CxxUnregisterExceptionObject(esp0,num);
            //	}
            ITryCatchFinallyStatement state_tcf = statements[2] as ITryCatchFinallyStatement;
            {
                // try{
                if (state_tcf == null ||
                    state_tcf.Try == null || state_tcf.Try.Statements.Count != 3 ||
                    state_tcf.Finally == null || state_tcf.Finally.Statements.Count != 1
                    )
                {
                    return(false);
                }

                //     try{
                //	       <statements>
                //	   }catch when{}
                ITryCatchFinallyStatement state_tcf2 = state_tcf.Try.Statements[0] as ITryCatchFinallyStatement;
                if (state_tcf2 == null || state_tcf2.Try == null)
                {
                    return(false);
                }

                //     <break;goto;continue;return; 等>

                //     if(**!=**)throw;
                IConditionStatement state_cond = state_tcf.Try.Statements[state_tcf.Try.Statements.Count - 1] as IConditionStatement;
                if (state_cond == null || state_cond.Then.Statements.Count != 1)
                {
                    return(false);
                }
                IBinaryExpression exp_bin = state_cond.Condition as IBinaryExpression;
                if (exp_bin == null || exp_bin.Operator != BinaryOperator.ValueInequality)
                {
                    return(false);
                }
                IThrowExceptionStatement state_exc = state_cond.Then.Statements[0] as IThrowExceptionStatement;
                if (state_exc == null)
                {
                    return(false);
                }

                // } finally {
                //     ::__CxxUnregisterExceptionObject((void*)num2,(int)num);
                // }
                IMethodInvokeExpression exp_inv = GetInvokeExpression(state_tcf.Finally.Statements[0]);
                if (exp_inv == null || exp_inv.Arguments.Count != 2)
                {
                    return(false);
                }
                IMethodReferenceExpression exp_mref = exp_inv.Method as IMethodReferenceExpression;
                if (exp_mref == null || exp_mref.Method == null || exp_mref.Method.Name.TrimStart('_') != "CxxUnregisterExceptionObject")
                {
                    return(false);
                }

                // <statements>
                statements = state_tcf2.Try.Statements;
                return(true);
            }
        }
예제 #16
0
        private static bool DetectLocalRefVariable(string var_disposable, IStatement next, IStatement next2, out LocalRefVariableStatement ret_lrv)
        {
            ret_lrv = new LocalRefVariableStatement();
            //-------------------------------------------------------
            // 第二文
            //-------------------------------------------------------
            // try{
            //   ... // null-declarations
            //   var_name=var_disposable;
            //   ...
            // }fault{
            //   var_name->Dispose();
            // }
            ITryCatchFinallyStatement state_next = next as ITryCatchFinallyStatement;

            if (state_next == null ||
                state_next.Try == null || state_next.Try.Statements.Count == 0 ||
                state_next.Fault == null || state_next.Fault.Statements.Count != 1
                )
            {
                return(false);
            }

            //
            // null-declarations を飛ばす
            //
            int i_assign = 0;
            IStatementCollection try_states = state_next.Try.Statements;

            while (IsNullDeclaration(try_states[i_assign]))
            {
                if (++i_assign >= try_states.Count)
                {
                    return(false);
                }
            }

            //
            // var_name=var_disposable の var_name を取得
            //
            IAssignExpression exp_assign = GetAssignExpression(state_next.Try.Statements[i_assign]);

            if (exp_assign == null || var_disposable != GetVariableName(exp_assign.Expression))
            {
                return(false);
            }
            ret_lrv.var_name = GetVariableName(exp_assign.Target);
            if (ret_lrv.var_name == null)
            {
                return(false);
            }

            //
            // fault 内の形式の確認
            //
            {
                // **->**();
                IMethodInvokeExpression exp_inv = GetInvokeExpression(state_next.Fault.Statements[0]);
                if (exp_inv == null || exp_inv.Arguments.Count != 0)
                {
                    return(false);
                }
                // **->Dispose();
                IMethodReferenceExpression method = exp_inv.Method as IMethodReferenceExpression;
                if (method == null || method.Method == null || method.Method.Name != "Dispose")
                {
                    return(false);
                }
                // disposable->Dispose();
                if (ret_lrv.var_name != GetVariableName(method.Target))
                {
                    return(false);
                }
            }

            //-------------------------------------------------------
            // 第三文
            //-------------------------------------------------------
            // "Label:"?
            //   var_name->Dispose();
            //
            ILabeledStatement labeled = next2 as ILabeledStatement;

            if (labeled != null)
            {
                ret_lrv.labelname = labeled.Name;
                next2             = labeled.Statement;
            }
            {
                // **->**();
                IMethodInvokeExpression exp_inv = GetInvokeExpression(next2);
                if (exp_inv == null || exp_inv.Arguments.Count != 0)
                {
                    return(false);
                }
                // **->Dispose();
                IMethodReferenceExpression method = exp_inv.Method as IMethodReferenceExpression;
                if (method == null || method.Method == null || method.Method.Name != "Dispose")
                {
                    return(false);
                }
                // disposable->Dispose();
                if (ret_lrv.var_name != GetVariableName(method.Target))
                {
                    return(false);
                }
            }

            ret_lrv.block = state_next.Try;
            ret_lrv.block.Statements.RemoveAt(i_assign);
            return(true);
        }
예제 #17
0
        //===========================================================
        //		構文合致
        //===========================================================
        /// <summary>
        ///
        /// </summary>
        /// <param name="var_deleted">削除される予定の変数</param>
        /// <param name="next_state">
        /// 本当に削除命令なのかを確認する為に、次の文を指定。
        /// if(disposable!=nullptr)disposable->Dispose(); なら OK
        /// </param>
        /// <returns>delete だったら true。そうでなかったら、false。</returns>
        private static bool DetectDeleteStatement(string disposable_name, IStatement next_state)
        {
            //---------------------------------------------------
            //		if(disposable==nullptr)
            //---------------------------------------------------
            // if
            IConditionStatement cond = next_state as IConditionStatement;

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

            // ==
            IBinaryExpression exp_bin = cond.Condition as IBinaryExpression;

            if (exp_bin == null || exp_bin.Operator != BinaryOperator.IdentityInequality)
            {
                return(false);
            }

            // disposable
            IVariableReferenceExpression exp_var = exp_bin.Left as IVariableReferenceExpression;

            if (exp_var == null || exp_var.Variable.Resolve().Name != disposable_name)
            {
                return(false);
            }

            // nullptr
            ILiteralExpression exp_lit = exp_bin.Right as ILiteralExpression;

            if (exp_lit == null || exp_lit.Value != null)
            {
                return(false);
            }

            //---------------------------------------------------
            //		disposable->Dispose();
            //---------------------------------------------------
            // 単文
            IStatementCollection states_then = cond.Then.Statements;

            if (states_then == null || states_then.Count != 1)
            {
                return(false);
            }

            IExpressionStatement state_exp = states_then[0] as IExpressionStatement;

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

            // **->**();
            IMethodInvokeExpression exp_inv = state_exp.Expression as IMethodInvokeExpression;

            if (exp_inv == null || exp_inv.Arguments.Count != 0)
            {
                return(false);
            }

            // **->Dispose();
            IMethodReferenceExpression ref_dispose = exp_inv.Method as IMethodReferenceExpression;

            if (ref_dispose == null || ref_dispose.Method.Name != "Dispose")
            {
                return(false);
            }

            // disposable->Dispose();
            exp_var = ref_dispose.Target as IVariableReferenceExpression;
            if (exp_var == null || exp_var.Variable.Resolve().Name != disposable_name)
            {
                return(false);
            }

            //---------------------------------------------------
            //		delete disposable
            //---------------------------------------------------
            return(true);
        }
예제 #18
0
        public static void WriteExpression(LanguageWriter w, IExpression exp, bool paren)
        {
            if (paren)
            {
                w.Write("(");
            }
            switch (GetExpressionType(exp))
            {
            case ExpressionType.AddressDereference:
                WriteAddressDereference(w, (IAddressDereferenceExpression)exp);
                break;

            case ExpressionType.AddressOf:
                w.Write("&");
                WriteExpression(w, ((IAddressOfExpression)exp).Expression, false);
                break;

            case ExpressionType.AddressOut:                                     // 引数 out 渡し
                WriteExpression(w, ((IAddressOutExpression)exp).Expression, false);
                break;

            case ExpressionType.AddressReference:                       // 引数 ref 渡し
                WriteExpression(w, ((IAddressReferenceExpression)exp).Expression, false);
                break;

            case ExpressionType.ArgumentList:
                w.WriteKeyword("__arglist");
                break;

            case ExpressionType.ArgumentReference:
                w.WriteParameterReference(((IArgumentReferenceExpression)exp).Parameter);
                break;

            case ExpressionType.ArrayCreate:
                WriteArrayCreate(w, (IArrayCreateExpression)exp);
                break;

            case ExpressionType.ArrayIndexer:
                WriteArrayIndexerExpression(w, (IArrayIndexerExpression)exp);
                break;

            case ExpressionType.Assign:
                WriteAssign(w, (IAssignExpression)exp);
                break;

            case ExpressionType.BaseReference:
                w.baseType.WriteName(w);
                break;

            case ExpressionType.Binary:
                WriteBinary(w, (IBinaryExpression)exp);
                break;

            case ExpressionType.Block:
                WriteBlock(w, (IBlockExpression)exp);
                break;

            case ExpressionType.CanCast:
                WriteCanCast(w, (ICanCastExpression)exp);
                break;

            case ExpressionType.Cast:
                WriteCast(w, (ICastExpression)exp);
                break;

            case ExpressionType.Condition:
                WriteCondition(w, (IConditionExpression)exp);
                break;

            case ExpressionType.DelegateCreate:
                WriteDelegateCreate(w, (IDelegateCreateExpression)exp);
                break;

            case ExpressionType.Literal:
                w.WriteAsLiteral(((ILiteralExpression)exp).Value);
                break;

            case ExpressionType.MethodInvoke:
                WriteMethodInvoke(w, (IMethodInvokeExpression)exp);
                break;

            case ExpressionType.ObjectCreate:
                WriteObjectCreate(w, (IObjectCreateExpression)exp);
                break;

            case ExpressionType.SizeOf:
                w.WriteKeyword("sizeof");
                w.Write("(");
                new TypeRef(((ISizeOfExpression)exp).Type).WriteName(w);
                w.Write(")");
                break;

            case ExpressionType.Snippet:
                w.WriteAsLiteral(((ISnippetExpression)exp).Value);
                break;

            case ExpressionType.ThisReference:
                w.WriteKeyword("this");
                break;

            case ExpressionType.TryCast:
                WriteTryCast(w, (ITryCastExpression)exp);
                break;

            case ExpressionType.TypeOf:
                new TypeRef(((ITypeOfExpression)exp).Type).WriteName(w);
                w.Write("::");
                w.WriteKeyword("typeid");
                break;

            case ExpressionType.TypeReference:
                WriteTypeReference(w, (ITypeReferenceExpression)exp);
                break;

            case ExpressionType.Unary:
                WriteUnary(w, (IUnaryExpression)exp);
                break;

            case ExpressionType.VariableDeclaration:
                WriteVariableDeclaration(w, ((IVariableDeclarationExpression)exp).Variable);
                break;

            case ExpressionType.VariableReference:
                w.WriteVariableReference(((IVariableReferenceExpression)exp).Variable);
                break;

            case ExpressionType.MemberInitializer:                     // 属性の初期化の際のメンバ指定
                WriteMemberInitializer(w, (IMemberInitializerExpression)exp);
                break;

            //---------------------------------------------------
            // メンバアクセス
            //---------------------------------------------------
            case ExpressionType.EventReference:
                WriteEventReference(w, (IEventReferenceExpression)exp);
                break;

            case ExpressionType.FieldReference:
                IFieldReferenceExpression exp_fld = (IFieldReferenceExpression)exp;
                WriteMemberAccess(w, exp_fld.Target);
                w.WriteFieldReference(exp_fld.Field);
                break;

            case ExpressionType.PropertyReference:
                WritePropertyReference(w, (IPropertyReferenceExpression)exp);
                break;

            case ExpressionType.PropertyIndexer:
                IPropertyIndexerExpression exp_pind = (IPropertyIndexerExpression)exp;
                WritePropertyReference(w, exp_pind.Target);
                w.Write("[");
                w.WriteExpressionCollection(exp_pind.Indices);
                w.Write("]");
                break;

            case ExpressionType.MethodReference:
                IMethodReferenceExpression exp_meth = (IMethodReferenceExpression)exp;
                WriteMemberAccess(w, exp_meth.Target);
                w.WriteMethodReference(exp_meth.Method);
                break;

            //---------------------------------------------------
            //	代替
            //---------------------------------------------------
            case ExpressionType.StackAlloc:
                WriteStackAllocate(w, (IStackAllocateExpression)exp);
                break;

            case ExpressionType.AnonymousMethod:
                WriteAnonymousMethod(w, (IAnonymousMethodExpression)exp);
                break;

            //---------------------------------------------------
            //	以下未対応
            //---------------------------------------------------
            case ExpressionType.NullCoalescing:
                WriteBinaryNullCoalescing(w, (INullCoalescingExpression)exp);
                break;

            case ExpressionType.DelegateInvoke:
            case ExpressionType.FieldOf:
            case ExpressionType.GenericDefault:
            case ExpressionType.Lambda:
            case ExpressionType.MethodOf:
            case ExpressionType.Query:
                goto default;

            case ExpressionType.TypedReferenceCreate:
            case ExpressionType.TypeOfTypedReference:
            case ExpressionType.ValueOfTypedReference:
                //throw new System.NotImplementedException("未だ実装していません\r\n");
                goto default;

            case ExpressionType.Unknown:
            default:
                ThrowUnknownExpression(exp);
                break;
            }
            if (paren)
            {
                w.Write(")");
            }
        }
예제 #19
0
 public override void TranslateExpression(IMethodReferenceExpression methodRefExpression)
 {
     this.Provider.GenerateCodeFromExpression(methodRefExpression.GenerateCodeDom(this.Options), base.Target, this.Options.Options);
 }
예제 #20
0
 protected override IExpression ConvertMethodInvoke(IMethodInvokeExpression imie)
 {
     // Insert an Increment statement to support Sequential loops
     // if we find the pattern:
     // forwardExpr = ReplicateOp_Divide.UsesAverageConditional(backwardExpr[index], marginalExpr, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // MarginalIncrement(marginalExpr, forwardExpr, backwardExpr[index]);
     if (Recognizer.IsStaticMethod(imie, typeof(ReplicateOp_Divide), "UsesAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          marginalExpr = imie.Arguments[1];
         IExpression          indexExpr    = imie.Arguments[2];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[3];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             MethodInfo method = itr.DotNetType.GetMethod("MarginalIncrement");
             method = method.MakeGenericMethod(imre.Method.MethodInfo.GetGenericArguments());
             IExpression rhs       = Builder.StaticGenericMethod(method, marginalExpr, forwardExpr, backwardExpr);
             IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
             var         seq       = context.InputAttributes.Get <Sequential>(indexVar);
             var         attr      = new IncrementStatement(indexVar, seq.BackwardPass);
             context.OutputAttributes.Set(increment, attr);
             onUpdate[backwardDecl] = increment;
         }
     }
     // if we find the pattern:
     // forwardExpr = Replicate2BufferOp.UsesAverageConditional(backwardExpr, *, marginalExpr, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // marginalExpr = MarginalIncrement(marginalExpr, forwardExpr, backwardExpr[index]);
     if (Recognizer.IsStaticMethod(imie, typeof(Replicate2BufferOp), "UsesAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          marginalExpr = imie.Arguments[2];
         IExpression          indexExpr    = imie.Arguments[3];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[4];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             MethodInfo method = itr.DotNetType.GetMethod("MarginalIncrement");
             method = method.MakeGenericMethod(imre.Method.MethodInfo.GetGenericArguments());
             IExpression rhs       = Builder.StaticGenericMethod(method, marginalExpr, forwardExpr, Builder.ArrayIndex(backwardExpr, indexExpr));
             IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
             var         seq       = context.InputAttributes.Get <Sequential>(indexVar);
             var         attr      = new IncrementStatement(indexVar, seq.BackwardPass);
             context.OutputAttributes.Set(increment, attr);
             onUpdate[backwardDecl] = increment;
         }
     }
     // if we find the pattern:
     // forwardExpr = JaggedSubarrayOp<>.ItemsAverageConditional(backwardExpr[index], *, marginalExpr, indices, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // MarginalIncrement(marginalExpr, forwardExpr, backwardExpr[index], indices, index)
     if (Recognizer.IsStaticGenericMethod(imie, typeof(JaggedSubarrayOp <>), "ItemsAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          marginalExpr = imie.Arguments[2];
         IExpression          indicesExpr  = imie.Arguments[3];
         IExpression          indexExpr    = imie.Arguments[4];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[5];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             IExpression[] args2             = new IExpression[] { marginalExpr, forwardExpr, backwardExpr, indicesExpr, indexExpr };
             Type[]        argTypes          = Array.ConvertAll(args2, e => e.GetExpressionType());
             Exception     exception;
             MethodInfo    method = (MethodInfo)Reflection.Invoker.GetBestMethod(itr.DotNetType, "MarginalIncrement",
                                                                                 BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy, null, argTypes, out exception);
             if (method == null)
             {
                 Error("Cannot find a compatible MarginalIncrement method for JaggedSubarrayOp", exception);
             }
             else
             {
                 IExpression rhs       = Builder.StaticGenericMethod(method, args2);
                 IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
                 var         seq       = context.InputAttributes.Get <Sequential>(indexVar);
                 var         attr      = new IncrementStatement(indexVar, seq.BackwardPass);
                 context.OutputAttributes.Set(increment, attr);
                 onUpdate[backwardDecl] = increment;
             }
         }
     }
     // if we find the pattern:
     // forwardExpr = JaggedSubarrayWithMarginalOp<>.ItemsAverageConditional(backwardExpr[index], *, marginalExpr, indices, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // MarginalIncrementItems(backwardExpr[index], forwardExpr,  indices, index, marginalExpr)
     if (Recognizer.IsStaticGenericMethod(imie, typeof(JaggedSubarrayWithMarginalOp <>), "ItemsAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         IExpression          marginalExpr = imie.Arguments[2];
         IExpression          indicesExpr  = imie.Arguments[3];
         IExpression          indexExpr    = imie.Arguments[4];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[5];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             IExpression[] args2             = new IExpression[] { backwardExpr, forwardExpr, indicesExpr, indexExpr, marginalExpr };
             Type[]        argTypes          = Array.ConvertAll(args2, e => e.GetExpressionType());
             Exception     exception;
             MethodInfo    method = (MethodInfo)Reflection.Invoker.GetBestMethod(itr.DotNetType, "MarginalIncrementItems",
                                                                                 BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy, null, argTypes, out exception);
             if (method == null)
             {
                 Error("Cannot find a compatible MarginalIncrementItems method for JaggedSubarrayWithMarginalOp", exception);
             }
             else
             {
                 IExpression rhs       = Builder.StaticGenericMethod(method, args2);
                 IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
                 var         seq       = context.InputAttributes.Get <Sequential>(indexVar);
                 var         attr      = new IncrementStatement(indexVar, seq.BackwardPass);
                 context.OutputAttributes.Set(increment, attr);
                 object backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
                 onUpdate[backwardDecl] = increment;
                 IVariableDeclaration marginalVar = Recognizer.GetVariableDeclaration(marginalExpr);
                 suppressUpdate[marginalVar] = attr;
             }
             var indicesVar = Recognizer.GetDeclaration(indicesExpr);
             if (indicesVar != null)
             {
                 DistributedCommunicationExpression dce = context.GetAttribute <DistributedCommunicationExpression>(indicesVar);
                 if (dce != null)
                 {
                     context.OutputAttributes.Set(imie, dce);
                 }
             }
         }
     }
     // if we find the pattern:
     // backwardExpr = JaggedSubarrayWithMarginalOp<>.ArrayAverageConditional(forwardExpr, marginalExpr, backwardExpr)
     // then when forwardExpr is updated, we insert the following statement:
     // MarginalIncrementArray
     if (Recognizer.IsStaticGenericMethod(imie, typeof(JaggedSubarrayWithMarginalOp <>), "ArrayAverageConditional"))
     {
         IExpression forwardExpr  = imie.Arguments[0];
         IExpression marginalExpr = imie.Arguments[1];
         IExpression backwardExpr = imie.Arguments[2];
         if (true)
         {
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             IExpression[] args2             = new IExpression[] { forwardExpr, backwardExpr, marginalExpr };
             Type[]        argTypes          = Array.ConvertAll(args2, e => e.GetExpressionType());
             Exception     exception;
             MethodInfo    method = (MethodInfo)Reflection.Invoker.GetBestMethod(itr.DotNetType, "MarginalIncrementArray",
                                                                                 BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy, null, argTypes, out exception);
             if (method == null)
             {
                 Error("Cannot find a compatible MarginalIncrementArray method for JaggedSubarrayWithMarginalOp", exception);
             }
             else
             {
                 IExpression rhs       = Builder.StaticGenericMethod(method, args2);
                 IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
                 var         attr      = new IncrementStatement(null, false);
                 context.OutputAttributes.Set(increment, attr);
                 object forwardDecl = Recognizer.GetArrayDeclaration(forwardExpr);
                 onUpdate[forwardDecl] = increment;
             }
             IVariableDeclaration marginalVar = Recognizer.GetVariableDeclaration(marginalExpr);
             // only suppress when we also have MarginalIncrementItems
             //suppressUpdate.Add(marginalVar);
         }
     }
     // if we find the pattern:
     // forwardExpr = GetItemsOp<>.ItemsAverageConditional(backwardExpr[index], *, marginalExpr, indices, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // MarginalIncrement(marginalExpr, forwardExpr, backwardExpr[index], indices, index)
     if (Recognizer.IsStaticGenericMethod(imie, typeof(GetItemsOp <>), "ItemsAverageConditional") ||
         Recognizer.IsStaticGenericMethod(imie, typeof(GetJaggedItemsOp <>), "ItemsAverageConditional") ||
         Recognizer.IsStaticGenericMethod(imie, typeof(GetDeepJaggedItemsOp <>), "ItemsAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          marginalExpr = imie.Arguments[2];
         IExpression          indicesExpr  = imie.Arguments[3];
         IExpression          indexExpr    = imie.Arguments[4];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[5];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             MethodInfo method = itr.GenericType.DotNetType.GetMethod("MarginalIncrement");
             method = method.MakeGenericMethod(imre.Method.MethodInfo.GetGenericArguments());
             IExpression rhs = Builder.StaticGenericMethod(method, marginalExpr, forwardExpr, backwardExpr, indicesExpr, indexExpr);
             //IStatement increment = Builder.ExprStatement(rhs);
             IStatement increment = Builder.AssignStmt(marginalExpr, rhs);
             var        seq       = context.InputAttributes.Get <Sequential>(indexVar);
             var        attr      = new IncrementStatement(indexVar, seq.BackwardPass);
             context.OutputAttributes.Set(increment, attr);
             onUpdate[backwardDecl] = increment;
         }
     }
     // if we find the pattern:
     // forwardExpr = GetItemsOp<>.ItemsAverageConditional(backwardExpr[index], *, marginalExpr, indices, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // MarginalIncrement(marginalExpr, forwardExpr, backwardExpr[index], indices, index)
     if (Recognizer.IsStaticGenericMethod(imie, typeof(GetItemsWithDictionaryOp <>), "ItemsAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          marginalExpr = imie.Arguments[2];
         IExpression          indicesExpr  = imie.Arguments[3];
         IExpression          dictExpr     = imie.Arguments[4];
         IExpression          indexExpr    = imie.Arguments[5];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[6];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             MethodInfo method = itr.GenericType.DotNetType.GetMethod("MarginalIncrement");
             method = method.MakeGenericMethod(imre.Method.MethodInfo.GetGenericArguments());
             IExpression rhs       = Builder.StaticGenericMethod(method, marginalExpr, forwardExpr, backwardExpr, indicesExpr, dictExpr, indexExpr);
             IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
             var         seq       = context.InputAttributes.Get <Sequential>(indexVar);
             var         attr      = new IncrementStatement(indexVar, seq.BackwardPass);
             context.OutputAttributes.Set(increment, attr);
             onUpdate[backwardDecl] = increment;
         }
     }
     // if we find the pattern:
     // partialExpr = GetItemsOp2<>.Partial(backwardExpr[index], to_array, indices, index, partialExpr);
     // then when backwardExpr is updated, we insert the following statement:
     // to_array[indices[index]] = ArrayIncrement(partialExpr, backwardExpr[index])
     if (Recognizer.IsStaticGenericMethod(imie, typeof(GetItemsOp2 <>), "Partial"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          to_array     = imie.Arguments[1];
         IExpression          indicesExpr  = imie.Arguments[2];
         IExpression          indexExpr    = imie.Arguments[3];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[4];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             MethodInfo method = itr.GenericType.DotNetType.GetMethod("ArrayIncrement");
             method = method.MakeGenericMethod(imre.Method.MethodInfo.GetGenericArguments());
             IExpression resultExpr = Builder.ArrayIndex(to_array, Builder.ArrayIndex(indicesExpr, indexExpr));
             IExpression rhs        = Builder.StaticGenericMethod(method, forwardExpr, backwardExpr, resultExpr);
             IStatement  increment  = Builder.AssignStmt(resultExpr, rhs);
             var         seq        = context.InputAttributes.Get <Sequential>(indexVar);
             var         attr       = new IncrementStatement(indexVar, seq.BackwardPass);
             context.OutputAttributes.Set(increment, attr);
             onUpdate[backwardDecl] = increment;
         }
     }
     // if we find the pattern:
     // forwardExpr = GetItemsJaggedOp<>.ItemsAverageConditional(backwardExpr[index], *, marginalExpr, indices, indices2, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // MarginalIncrement(marginalExpr, forwardExpr, backwardExpr[index], indices, indices2, index)
     if (Recognizer.IsStaticGenericMethod(imie, typeof(GetItemsFromJaggedOp <>), "ItemsAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          marginalExpr = imie.Arguments[2];
         IExpression          indicesExpr  = imie.Arguments[3];
         IExpression          indices2Expr = imie.Arguments[4];
         IExpression          indexExpr    = imie.Arguments[5];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[6];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             MethodInfo method = itr.GenericType.DotNetType.GetMethod("MarginalIncrement");
             method = method.MakeGenericMethod(imre.Method.MethodInfo.GetGenericArguments());
             IExpression rhs       = Builder.StaticGenericMethod(method, marginalExpr, forwardExpr, backwardExpr, indicesExpr, indices2Expr, indexExpr);
             IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
             var         seq       = context.InputAttributes.Get <Sequential>(indexVar);
             var         attr      = new IncrementStatement(indexVar, seq.BackwardPass);
             context.OutputAttributes.Set(increment, attr);
             onUpdate[backwardDecl] = increment;
         }
     }
     // if we find the pattern:
     // forwardExpr = GetItemsDeepJaggedOp<>.ItemsAverageConditional(backwardExpr[index], *, marginalExpr, indices, indices2, indices3, index, forwardExpr)
     // then when backwardExpr is updated, we insert the following statement:
     // MarginalIncrement(marginalExpr, forwardExpr, backwardExpr[index], indices, indices2, indices3, index)
     if (Recognizer.IsStaticGenericMethod(imie, typeof(GetItemsFromDeepJaggedOp <>), "ItemsAverageConditional"))
     {
         IExpression          backwardExpr = imie.Arguments[0];
         object               backwardDecl = Recognizer.GetArrayDeclaration(backwardExpr);
         IExpression          marginalExpr = imie.Arguments[2];
         IExpression          indicesExpr  = imie.Arguments[3];
         IExpression          indices2Expr = imie.Arguments[4];
         IExpression          indices3Expr = imie.Arguments[5];
         IExpression          indexExpr    = imie.Arguments[6];
         IVariableDeclaration indexVar     = Recognizer.GetVariableDeclaration(indexExpr);
         IExpression          forwardExpr  = imie.Arguments[7];
         if (indexVar != null && context.InputAttributes.Has <Sequential>(indexVar))
         {
             if (!compiler.UseSerialSchedules)
             {
                 context.Warning(indexVar.Name + " is marked Sequential but engine.Compiler.UseSerialSchedules = false");
             }
             IMethodReferenceExpression imre = imie.Method;
             ITypeReference             itr  = ((ITypeReferenceExpression)imre.Target).Type;
             MethodInfo method = itr.GenericType.DotNetType.GetMethod("MarginalIncrement");
             method = method.MakeGenericMethod(imre.Method.MethodInfo.GetGenericArguments());
             IExpression rhs       = Builder.StaticGenericMethod(method, marginalExpr, forwardExpr, backwardExpr, indicesExpr, indices2Expr, indices3Expr, indexExpr);
             IStatement  increment = Builder.AssignStmt(marginalExpr, rhs);
             var         seq       = context.InputAttributes.Get <Sequential>(indexVar);
             var         attr      = new IncrementStatement(indexVar, seq.BackwardPass);
             context.OutputAttributes.Set(increment, attr);
             onUpdate[backwardDecl] = increment;
         }
     }
     return(base.ConvertMethodInvoke(imie));
 }
예제 #21
0
 public override IOperation VisitMethodReferenceExpression(IMethodReferenceExpression operation, object argument)
 {
     return(new MethodReferenceExpression(operation.Method, operation.IsVirtual, Visit(operation.Instance), operation.Member, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit));
 }
예제 #22
0
 public virtual void VisitMethodReferenceExpression(IMethodReferenceExpression operation)
 {
     DefaultVisit(operation);
 }
 public MethodInvokeExpression(IMethodReferenceExpression method, List <IExpression> arguments)
 {
     _method    = method;
     _arguments = arguments;
 }
예제 #24
0
 public virtual void VisitMethodReferenceExpression(IMethodReferenceExpression e)
 {
 }
예제 #25
0
 public NewDelegateExpression(IType type, IMethodReferenceExpression method)
 {
     DelegateType = type;
     Method       = method;
 }
예제 #26
0
 public MethodInvokeExpression(IMethodReferenceExpression reference, IExpressionCollection argumentExpressions)
 {
     this.reference           = reference;
     this.argumentExpressions = argumentExpressions;
 }
 public virtual IExpression TransformMethodReferenceExpression(IMethodReferenceExpression value)
 {
     value.Target = this.TransformExpression(value.Target);
     return value;
 }