상속: System.CodeDom.CodeExpression
		public void Constructor0_Deny_Unrestricted ()
		{
			CodeDelegateInvokeExpression cdie = new CodeDelegateInvokeExpression ();
			Assert.AreEqual (0, cdie.Parameters.Count, "Parameters");
			Assert.IsNull (cdie.TargetObject, "TargetObject");
			cdie.TargetObject = new CodeExpression ();
		}
 public static CodeDelegateInvokeExpression Clone(this CodeDelegateInvokeExpression expression)
 {
     if (expression == null) return null;
     CodeDelegateInvokeExpression e = new CodeDelegateInvokeExpression();
     e.Parameters.AddRange(expression.Parameters.Clone());
     e.TargetObject = expression.TargetObject.Clone();
     e.UserData.AddRange(expression.UserData);
     return e;
 }
		public void Constructor2_Deny_Unrestricted ()
		{
			CodeExpression target = new CodeExpression ();
			CodeExpression[] parameters = new CodeExpression[1] { target };
			CodeDelegateInvokeExpression cdie = new CodeDelegateInvokeExpression (target, parameters);
			Assert.AreEqual (1, cdie.Parameters.Count, "Parameters");
			Assert.AreSame (target, cdie.TargetObject, "TargetObject");
			cdie.TargetObject = new CodeExpression ();
		}
 public TypescriptDelegateInvokeExpression(
     IExpressionFactory expressionFactory,
     CodeDelegateInvokeExpression codeExpression, 
     CodeGeneratorOptions options)
 {
     _expressionFactory = expressionFactory;
     _codeExpression = codeExpression;
     _options = options;
     System.Diagnostics.Debug.WriteLine("TypescriptDelegateInvokeExpression Created");
 }
        public bool ValidateCodeDelegateInvokeExpression (CodeDelegateInvokeExpression exp) {
            bool result = true;
            PushLocation (exp);

            foreach (CodeExpression e in exp.Parameters)
                if (!IsSimpleTarget (e))
                    result = false;

            if (exp.TargetObject != null && !IsSimpleTarget (exp.TargetObject))
                result = false;

            PopLocation();
            return result;
        }
예제 #6
0
		protected override void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression expression)
		{
			if (expression.TargetObject != null)
				GenerateExpression (expression.TargetObject);
			Output.Write ('(');
			OutputExpressionList (expression.Parameters);
			Output.Write (')');
		}
예제 #7
0
 protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression expression)
 {
     throw new NotSupportedException();
 }
		void AddAsyncMembers (string messageName, CodeMemberMethod method)
		{
			CodeThisReferenceExpression ethis = new CodeThisReferenceExpression();
			CodePrimitiveExpression enull = new CodePrimitiveExpression (null);
			
			CodeMemberField codeField = new CodeMemberField (typeof(System.Threading.SendOrPostCallback), messageName + "OperationCompleted");
			codeField.Attributes = MemberAttributes.Private;
			CodeTypeDeclaration.Members.Add (codeField);
			
			// Event arguments class
			
			string argsClassName = classNames.AddUnique (messageName + "CompletedEventArgs", null);
			CodeTypeDeclaration argsClass = new CodeTypeDeclaration (argsClassName);
			argsClass.BaseTypes.Add (new CodeTypeReference ("System.ComponentModel.AsyncCompletedEventArgs"));

			CodeMemberField resultsField = new CodeMemberField (typeof(object[]), "results");
			resultsField.Attributes = MemberAttributes.Private;
			argsClass.Members.Add (resultsField);
			
			CodeConstructor cc = new CodeConstructor ();
			cc.Attributes = MemberAttributes.Assembly;
			cc.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object[]), "results"));
			cc.Parameters.Add (new CodeParameterDeclarationExpression (typeof(System.Exception), "exception"));
			cc.Parameters.Add (new CodeParameterDeclarationExpression (typeof(bool), "cancelled"));
			cc.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), "userState"));
			cc.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("exception"));
			cc.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("cancelled"));
			cc.BaseConstructorArgs.Add (new CodeVariableReferenceExpression ("userState"));
			CodeExpression thisResults = new CodeFieldReferenceExpression (ethis, "results");
			cc.Statements.Add (new CodeAssignStatement (thisResults, new CodeVariableReferenceExpression ("results")));
			argsClass.Members.Add (cc);
			
			int ind = 0;
			
			if (method.ReturnType.BaseType != "System.Void")
				argsClass.Members.Add (CreateArgsProperty (method.ReturnType, "Result", ind++));
			
			foreach (CodeParameterDeclarationExpression par in method.Parameters) 
			{
				if (par.Direction == FieldDirection.Out || par.Direction == FieldDirection.Ref)
					argsClass.Members.Add (CreateArgsProperty (par.Type, par.Name, ind++));
			}
			
			bool needsArgsClass = (ind > 0);
			if (needsArgsClass)
				asyncTypes.Add (argsClass);
			else
				argsClassName = "System.ComponentModel.AsyncCompletedEventArgs";
			
			// Event delegate type
			
			CodeTypeDelegate delegateType = new CodeTypeDelegate (messageName + "CompletedEventHandler");
			delegateType.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), "sender"));
			delegateType.Parameters.Add (new CodeParameterDeclarationExpression (argsClassName, "args"));
			
			// Event member
			
			CodeMemberEvent codeEvent = new CodeMemberEvent ();
			codeEvent.Name = messageName + "Completed";
			codeEvent.Type = new CodeTypeReference (delegateType.Name);
			CodeTypeDeclaration.Members.Add (codeEvent);
			
			// Async method (without user state param)
			
			CodeMemberMethod am = new CodeMemberMethod ();
			am.Attributes = MemberAttributes.Public | MemberAttributes.Final;
			am.Name = method.Name + "Async";
			am.ReturnType = new CodeTypeReference (typeof(void));
			CodeMethodInvokeExpression inv;
			inv = new CodeMethodInvokeExpression (ethis, am.Name);
			am.Statements.Add (inv);
			
			// On...Completed method
			
			CodeMemberMethod onCompleted = new CodeMemberMethod ();
			onCompleted.Name = "On" + messageName + "Completed";
			onCompleted.Attributes = MemberAttributes.Private | MemberAttributes.Final;
			onCompleted.ReturnType = new CodeTypeReference (typeof(void));
			onCompleted.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), "arg"));
			
			CodeConditionStatement anIf = new CodeConditionStatement ();
			
			CodeExpression eventField = new CodeEventReferenceExpression (ethis, codeEvent.Name);
			anIf.Condition = new CodeBinaryOperatorExpression (eventField, CodeBinaryOperatorType.IdentityInequality, enull);
			CodeExpression castedArg = new CodeCastExpression (typeof(System.Web.Services.Protocols.InvokeCompletedEventArgs), new CodeVariableReferenceExpression ("arg"));
			CodeStatement invokeArgs = new CodeVariableDeclarationStatement (typeof(System.Web.Services.Protocols.InvokeCompletedEventArgs), "invokeArgs", castedArg);
			anIf.TrueStatements.Add (invokeArgs);
			
			CodeDelegateInvokeExpression delegateInvoke = new CodeDelegateInvokeExpression ();
			delegateInvoke.TargetObject = eventField;
			delegateInvoke.Parameters.Add (ethis);
			CodeObjectCreateExpression argsInstance = new CodeObjectCreateExpression (argsClassName);
			CodeExpression invokeArgsVar = new CodeVariableReferenceExpression ("invokeArgs");
			if (needsArgsClass) argsInstance.Parameters.Add (new CodeFieldReferenceExpression (invokeArgsVar, "Results"));
			argsInstance.Parameters.Add (new CodeFieldReferenceExpression (invokeArgsVar, "Error"));
			argsInstance.Parameters.Add (new CodeFieldReferenceExpression (invokeArgsVar, "Cancelled"));
			argsInstance.Parameters.Add (new CodeFieldReferenceExpression (invokeArgsVar, "UserState"));
			delegateInvoke.Parameters.Add (argsInstance);
			anIf.TrueStatements.Add (delegateInvoke);
			
			onCompleted.Statements.Add (anIf);
			
			// Async method
			
			CodeMemberMethod asyncMethod = new CodeMemberMethod ();
			asyncMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;
			asyncMethod.Name = method.Name + "Async";
			asyncMethod.ReturnType = new CodeTypeReference (typeof(void));
			
			CodeExpression delegateField = new CodeFieldReferenceExpression (ethis, codeField.Name);
			anIf = new CodeConditionStatement ();
			anIf.Condition = new CodeBinaryOperatorExpression (delegateField, CodeBinaryOperatorType.IdentityEquality, enull);;
			CodeExpression delegateRef = new CodeMethodReferenceExpression (ethis, onCompleted.Name);
			CodeExpression newDelegate = new CodeObjectCreateExpression (typeof(System.Threading.SendOrPostCallback), delegateRef);
			CodeAssignStatement cas = new CodeAssignStatement (delegateField, newDelegate);
			anIf.TrueStatements.Add (cas);
			asyncMethod.Statements.Add (anIf);
			
			CodeArrayCreateExpression paramsArray = new CodeArrayCreateExpression (typeof(object));
			
			// Assign parameters
			
			CodeIdentifiers paramsIds = new CodeIdentifiers ();
			
			foreach (CodeParameterDeclarationExpression par in method.Parameters) 
			{
				paramsIds.Add (par.Name, null);
				if (par.Direction == FieldDirection.In || par.Direction == FieldDirection.Ref) {
					CodeParameterDeclarationExpression inpar = new CodeParameterDeclarationExpression (par.Type, par.Name);
					am.Parameters.Add (inpar);
					asyncMethod.Parameters.Add (inpar);
					inv.Parameters.Add (new CodeVariableReferenceExpression (par.Name));
					paramsArray.Initializers.Add (new CodeVariableReferenceExpression (par.Name));
				}
			}


			inv.Parameters.Add (enull);
			
			string userStateName = paramsIds.AddUnique ("userState", null);
			asyncMethod.Parameters.Add (new CodeParameterDeclarationExpression (typeof(object), userStateName));
			
			CodeExpression userStateVar = new CodeVariableReferenceExpression (userStateName);
			asyncMethod.Statements.Add (BuildInvokeAsync (messageName, paramsArray, delegateField, userStateVar));
			
			CodeTypeDeclaration.Members.Add (am);
			CodeTypeDeclaration.Members.Add (asyncMethod);
			CodeTypeDeclaration.Members.Add (onCompleted);
			
			asyncTypes.Add (delegateType);
		}
예제 #9
0
		protected override void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression e)
		{
		}
		protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e)
		{
			Output.Write("[CodeDelegateInvokeExpression: {0}]", e.ToString());
		}
예제 #11
0
        public CodeExpression ParseBaseExpression()
        {
            if (TokenType == CDILToken.Integer)
            {
                CodePrimitiveExpression expr = new CodePrimitiveExpression(TokenValue);
                GetNextToken();
                return expr;
            }
            if (TokenType == CDILToken.String)
            {
                CodePrimitiveExpression expr = new CodePrimitiveExpression(TokenValue);
                GetNextToken();
                return expr;
            }
            if (IsKeyword("base"))
            {
                GetNextToken();
                return new CodeBaseReferenceExpression();
            }

            if (IsKeyword("null"))
            {
                GetNextToken();
                return new CodePrimitiveExpression(null);
            }

            if (IsKeyword("false"))
            {
                GetNextToken();
                return new CodePrimitiveExpression(false);
            }

            if (IsKeyword("true"))
            {
                GetNextToken();
                return new CodePrimitiveExpression(true);
            }

            if (IsKeyword("this"))
            {
                GetNextToken();
                return new CodeThisReferenceExpression();
            }

            if (IsKeyword("setvalue"))
            {
                GetNextToken();
                return new CodePropertySetValueReferenceExpression();
            }

            if (IsKeyword("arg"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                string name = EatKeyword();
                Expect(CDILToken.RightParen);
                return new CodeArgumentReferenceExpression(name);
            }

            if (IsKeyword("delegatecall"))
            {
                CodeDelegateInvokeExpression retval = new CodeDelegateInvokeExpression();
                GetNextToken();
                Expect(CDILToken.LeftParen);
                retval.TargetObject = ParseExpression();
                Expect(CDILToken.RightParen);
                Expect(CDILToken.LeftParen);
                while (TokenType != CDILToken.RightParen && TokenType != CDILToken.EOF)
                {
                    CodeExpression expr = ParseExpression();
                    retval.Parameters.Add(expr);
                    if (TokenType == CDILToken.Comma)
                    {
                        GetNextToken();
                    }
                }
                Expect(CDILToken.RightParen);
                return retval;
            }

            if (IsKeyword("typeref"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeTypeReference typeRef = ParseType();
                Expect(CDILToken.RightParen);
                return new CodeTypeReferenceExpression(typeRef);
            }

            if (IsKeyword("typeof"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeTypeReference typeRef = ParseType();
                Expect(CDILToken.RightParen);
                return new CodeTypeOfExpression(typeRef);
            }

            if (IsKeyword("add"))
            {
                CodeBinaryOperatorExpression cboe = new CodeBinaryOperatorExpression();
                cboe.Operator = CodeBinaryOperatorType.Add;
                GetNextToken();
                Expect(CDILToken.LeftParen);
                cboe.Left = ParseExpression();
                Expect(CDILToken.Comma);
                cboe.Right = ParseExpression();
                Expect(CDILToken.RightParen);
                return cboe;
            }

            if (IsKeyword("equal"))
            {
                CodeBinaryOperatorExpression cboe = new CodeBinaryOperatorExpression();
                cboe.Operator = CodeBinaryOperatorType.ValueEquality;
                GetNextToken();
                Expect(CDILToken.LeftParen);
                cboe.Left = ParseExpression();
                Expect(CDILToken.Comma);
                cboe.Right = ParseExpression();
                Expect(CDILToken.RightParen);
                return cboe;
            }

            if (IsKeyword("refequal"))
            {
                CodeBinaryOperatorExpression cboe = new CodeBinaryOperatorExpression();
                cboe.Operator = CodeBinaryOperatorType.IdentityEquality;
                GetNextToken();
                Expect(CDILToken.LeftParen);
                cboe.Left = ParseExpression();
                Expect(CDILToken.Comma);
                cboe.Right = ParseExpression();
                Expect(CDILToken.RightParen);
                return cboe;
            }

            if (IsKeyword("refnotequal"))
            {
                CodeBinaryOperatorExpression cboe = new CodeBinaryOperatorExpression();
                cboe.Operator = CodeBinaryOperatorType.IdentityInequality;
                GetNextToken();
                Expect(CDILToken.LeftParen);
                cboe.Left = ParseExpression();
                Expect(CDILToken.Comma);
                cboe.Right = ParseExpression();
                Expect(CDILToken.RightParen);
                return cboe;
            }

            if (IsKeyword("arrayitem"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeArrayIndexerExpression caie = new CodeArrayIndexerExpression();
                caie.TargetObject = ParseExpression();
                while (TokenType == CDILToken.Comma)
                {
                    Expect(CDILToken.Comma);
                    caie.Indices.Add(ParseExpression());
                }
                Expect(CDILToken.RightParen);
                return caie;
            }

            if (IsKeyword("index"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeIndexerExpression cie = new CodeIndexerExpression();
                cie.TargetObject = ParseExpression();
                while (TokenType == CDILToken.Comma)
                {
                    Expect(CDILToken.Comma);
                    cie.Indices.Add(ParseExpression());
                }
                Expect(CDILToken.RightParen);
                return cie;
            }

            if (IsKeyword("var"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                string name = EatKeyword();
                Expect(CDILToken.RightParen);
                return new CodeVariableReferenceExpression(name);
            }

            if (IsKeyword("defaultscope"))
            {
                GetNextToken();
                return null;
            }

            if (IsKeyword("ref"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeExpression expr = ParseExpression();
                Expect(CDILToken.RightParen);
                return new CodeDirectionExpression(FieldDirection.Ref, expr);
            }

            if (IsKeyword("out"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeExpression expr = ParseExpression();
                Expect(CDILToken.RightParen);
                return new CodeDirectionExpression(FieldDirection.Out, expr);
            }

            if (IsKeyword("cast"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeTypeReference type = ParseType();
                Expect(CDILToken.Comma);
                CodeExpression expr = ParseExpression();
                Expect(CDILToken.RightParen);
                return new CodeCastExpression(type, expr);
            }
            if (IsKeyword("new"))
            {
                GetNextToken();
                CodeTypeReference type = ParseType();
                CodeObjectCreateExpression retval = new CodeObjectCreateExpression(type);
                Expect(CDILToken.LeftParen);
                while (TokenType != CDILToken.RightParen && TokenType != CDILToken.EOF)
                {
                    CodeExpression expr = ParseExpression();
                    retval.Parameters.Add(expr);
                    if (TokenType == CDILToken.Comma)
                    {
                        GetNextToken();
                    }
                }
                Expect(CDILToken.RightParen);
                return retval;
            }

            if (IsKeyword("newarray"))
            {
                GetNextToken();
                Expect(CDILToken.LeftParen);
                CodeArrayCreateExpression retval = new CodeArrayCreateExpression();
                retval.CreateType = ParseType();
                Expect(CDILToken.Comma);
                retval.SizeExpression = ParseExpression();
                Expect(CDILToken.RightParen);
                return retval;
            }

            throw BuildException("Unexpected token '" + TokenType + "'");
        }
예제 #12
0
		protected abstract void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression e);
예제 #13
0
 private void ValidateDelegateInvokeExpression(CodeDelegateInvokeExpression e) {
    if (e.TargetObject != null) {
             ValidateExpression(e.TargetObject);
    }
    ValidateExpressionList(e.Parameters);
 }
예제 #14
0
            MakeReadFieldStatements(Type type,
                                    CodeExpression objExpr,
                                    FieldInfo finfo,
                                    CodeVariableReferenceExpression[] indexExprs)
        {
            CodeStatement[] stmts;
            CodeExpression readerExpr = new CodeArgumentReferenceExpression("reader");
            string readerName = GetBuiltinReaderName(type);
            if (readerName == null)
            {
                // For non-builtin types
                string serializerName = GetStaticSerializerName(type);
                CodeVariableReferenceExpression serializerExpr = new CodeVariableReferenceExpression(serializerName);                
                CodeVariableDeclarationStatement tempDecl = null;
                CodeExpression setterExpr = null;

                CodeExpression fieldExpr;
                if (finfo == null)
                {
                    fieldExpr = new CodeArrayIndexerExpression(objExpr, indexExprs);
                }
                else if (finfo.IsPublic && !finfo.IsInitOnly)
                {
                    fieldExpr = new CodeFieldReferenceExpression(objExpr, finfo.Name);
                }
                else
                {
                    string fieldName = TypeSystem.FieldName(finfo.Name);
                    if (!TypeSystem.IsBackingField(finfo.Name) ||
                        finfo.DeclaringType.GetProperty(fieldName, FieldFlags).GetSetMethod() == null)
                    {
                        setterExpr = new CodeVariableReferenceExpression(ExtensionClassName + "." + this.SetterFieldName(finfo));
                        fieldName = this.m_fieldToStaticName[finfo];
                    }
                    tempDecl = new CodeVariableDeclarationStatement(type, fieldName);
                    fieldExpr = new CodeVariableReferenceExpression(tempDecl.Name);
                }

                CodeExpression fieldValExpr = new CodeMethodInvokeExpression(serializerExpr, "Read", readerExpr);
                CodeStatement readCall = new CodeAssignStatement(fieldExpr, fieldValExpr);
                if (tempDecl == null)
                {
                    stmts = new CodeStatement[] { readCall };
                }
                else
                {
                    CodeStatement setCall;
                    if (setterExpr == null)
                    {
                        CodeExpression propExpr = new CodePropertyReferenceExpression(objExpr, tempDecl.Name);
                        setCall = new CodeAssignStatement(propExpr, fieldExpr);
                    }
                    else
                    {
                        if (finfo.DeclaringType.IsValueType)
                        {
                            objExpr = new CodeDirectionExpression(FieldDirection.Out, objExpr);
                        }
                        CodeExpression setExpr = new CodeDelegateInvokeExpression(setterExpr, objExpr, fieldExpr);
                        setCall = new CodeExpressionStatement(setExpr);
                    }
                    stmts = new CodeStatement[] { tempDecl, readCall, setCall };
                }
            }
            else
            {
                // for builtin types
                CodeExpression readCall = new CodeMethodInvokeExpression(readerExpr, readerName);
                if (finfo == null)
                {
                    CodeExpression fieldExpr = new CodeArrayIndexerExpression(objExpr, indexExprs);
                    stmts = new CodeStatement[] { new CodeAssignStatement(fieldExpr, readCall) };
                }
                else
                {
                    string fieldName = TypeSystem.FieldName(finfo.Name);
                    if ((finfo.IsPublic && !finfo.IsInitOnly) ||
                        (TypeSystem.IsBackingField(finfo.Name) &&
                         finfo.DeclaringType.GetProperty(fieldName, FieldFlags).GetSetMethod() != null))
                    {
                        CodeExpression fieldExpr = new CodeFieldReferenceExpression(objExpr, fieldName);
                        stmts = new CodeStatement[] { new CodeAssignStatement(fieldExpr, readCall) };
                    }
                    else
                    {
                        CodeExpression setterExpr = new CodeVariableReferenceExpression(
                                                            ExtensionClassName + "." + this.SetterFieldName(finfo));
                        if (finfo.DeclaringType.IsValueType)
                        {
                            objExpr = new CodeDirectionExpression(FieldDirection.Out, objExpr);
                        }
                        CodeExpression setExpr = new CodeDelegateInvokeExpression(setterExpr, objExpr, readCall);
                        stmts = new CodeStatement[] { new CodeExpressionStatement(setExpr) };
                    }
                }
            }

            if (!type.IsValueType &&
                (finfo != null || StaticConfig.AllowNullArrayElements) &&
                (finfo == null || AttributeSystem.FieldCanBeNull(finfo)))
            {
                CodeExpression bvIndex = indexExprs[0];
                if (finfo == null)
                {
                    string bvIndexString = indexExprs[0].VariableName;
                    for (int i = 1; i < indexExprs.Length; i++)
                    {
                        bvIndexString += "*" + indexExprs[i].VariableName;
                    }
                    bvIndex = new CodeSnippetExpression(bvIndexString);
                }
                CodeExpression bvExpr = new CodeArgumentReferenceExpression("bv");
                CodeExpression ifExpr = new CodeBinaryOperatorExpression(
                                                new CodeIndexerExpression(bvExpr, bvIndex),
                                                CodeBinaryOperatorType.IdentityEquality,
                                                new CodePrimitiveExpression(false));
                CodeStatement stmt = new CodeConditionStatement(ifExpr, stmts);
                stmts = new CodeStatement[] { stmt };
            }
            return stmts;
        }
예제 #15
0
        private CodeExpression VisitInvocation(InvocationExpression invocationExpression)
        {
            CodeExpression to = _Visit(invocationExpression.Expression);

            if (typeof(CodeMethodInvokeExpression).IsAssignableFrom(to.GetType()))
            {
                CodeMethodInvokeExpression mi = to as CodeMethodInvokeExpression;
                if (invocationExpression.Arguments.Count > 0)
                {
                    if (invocationExpression.Arguments[0] is ConstantExpression)
                        mi.Parameters.Add(_Visit(invocationExpression.Arguments[0]));
                    else
                        foreach (var par in (invocationExpression.Arguments[0] as NewArrayExpression).Expressions)
                        {
                            AddParam(mi.Parameters, par);
                        }
                }
                return mi;
            }
            else if (to is CodeDelegateInvokeExpression)
            {
                if (invocationExpression.Arguments.Count > 0)
                {
                    if (invocationExpression.Arguments[0] is ConstantExpression)
                        (to as CodeDelegateInvokeExpression).Parameters.Add(_Visit(invocationExpression.Arguments[0]));
                    else
                        foreach (var par in (invocationExpression.Arguments[0] as NewArrayExpression).Expressions)
                        {
                            AddParam((to as CodeDelegateInvokeExpression).Parameters, par);
                        }
                }
                return to;
            }
            else
            {
                var mi = new CodeDelegateInvokeExpression(to);
                if (invocationExpression.Arguments.Count > 0)
                {
                    if (invocationExpression.Arguments[0] is ConstantExpression)
                        mi.Parameters.Add(_Visit(invocationExpression.Arguments[0]));
                    else
                        foreach (var par in invocationExpression.Arguments)
                        {
                            AddParam(mi.Parameters, par);
                        }
                }
                return mi;
            }
        }
예제 #16
0
 protected override void GenerateDelegateInvokeExpression(System.CodeDom.CodeDelegateInvokeExpression e)
 {
     throw new Exception("The method or operation is not implemented.");
 }
예제 #17
0
 private void Write(CodeDelegateInvokeExpression e){
   TextWriter w = this.writer;
   this.Write(e.TargetObject);
   this.Write(e.Parameters);
 }
예제 #18
0
        protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e)
        {
            GenerateExpression(e.TargetObject);

            string comma = "";
            foreach (CodeExpression ce in e.Parameters) {
                Write(comma);
                GenerateExpression(ce);
                comma = ", ";
            }
        }
예제 #19
0
        private CodeExpression VisitMethodCall(MethodCallExpression methodCallExpression)
        {
            var mr = GetMethodRef(methodCallExpression.Method);
            if (methodCallExpression.Object == null)
            {
                if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.VarRef" ||
                    mr.MethodName == "LinqToCodedom.Generator.CodeDom.ParamRef")
                {
                    return new LinqToCodedom.Generator.CodeDom.CodeVarExpression(
                        CodeDom.Eval<string>(methodCallExpression.Arguments[0]));
                }

                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.TypeRef")
                {
                    var c = new CodeTypeReferenceExpression(
                        CodeDom.Eval<string>(methodCallExpression.Arguments[0]));

                    if (methodCallExpression.Arguments.Count == 2)
                    {
                        NewArrayExpression arr = methodCallExpression.Arguments[1] as NewArrayExpression;
                        foreach (Expression ee in arr.Expressions)
                        {
                            object t = CodeDom.Eval(ee);
                            c.Type.TypeArguments.Add(CodeDom.GetTypeReference(t));
                        }

                    }
                    return c;
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.TypeOf")
                {
                    var c = new CodeTypeOfExpression(
                        CodeDom.Eval<string>(methodCallExpression.Arguments[0]));

                    if (methodCallExpression.Arguments.Count == 2)
                    {
                        NewArrayExpression arr = methodCallExpression.Arguments[1] as NewArrayExpression;
                        foreach (Expression ee in arr.Expressions)
                        {
                            object t = CodeDom.Eval(ee);
                            c.Type.TypeArguments.Add(CodeDom.GetTypeReference(t));
                        }
                    }

                    return c;
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.get_nil")
                {
                    return null;
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.Property")
                {
                    CodeExpression targetExp = _Visit(methodCallExpression.Arguments[0]);
                    if (targetExp is CodePrimitiveExpression && ((CodePrimitiveExpression)targetExp).Value == null)
                    {
                        targetExp = null;
                    }

                    return new CodePropertyReferenceExpression(
                        targetExp,
                        CodeDom.Eval<string>(methodCallExpression.Arguments[1]));
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.Field")
                {
                    object val = null;
                    try
                    {
                        val = CodeDom.Eval(methodCallExpression.Arguments[0]);
                    }
                    catch (Exception)
                    {
                    }

                    if (val != null && val is CodeTypeReference)
                    {
                        return new CodeFieldReferenceExpression(
                            new CodeTypeReferenceExpression((CodeTypeReference)val),
                            CodeDom.Eval<string>(methodCallExpression.Arguments[1]));
                    }
                    else
                    {
                        CodeExpression targetExp = _Visit(methodCallExpression.Arguments[0]);
                        if (targetExp is CodePrimitiveExpression && ((CodePrimitiveExpression)targetExp).Value == null)
                        {
                            targetExp = null;
                        }

                        return new CodeFieldReferenceExpression(
                            targetExp,
                            CodeDom.Eval<string>(methodCallExpression.Arguments[1]));
                    }
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.Call")
                {
                    if (methodCallExpression.Arguments.Count == 1)
                    {
                        return new CodeMethodInvokeExpression(
                            null,
                            CodeDom.Eval<string>(methodCallExpression.Arguments[0]));
                    }
                    else
                    {
                        CodeExpression targetExp = _Visit(methodCallExpression.Arguments[0]);
                        if (targetExp is CodePrimitiveExpression && ((CodePrimitiveExpression)targetExp).Value == null)
                        {
                            targetExp = null;
                        }

                        var m = new CodeMethodReferenceExpression(
                            targetExp,
                            CodeDom.Eval<string>(methodCallExpression.Arguments[1]));

                        if (methodCallExpression.Arguments.Count == 3)
                        {
                            foreach (Expression e in (methodCallExpression.Arguments[2] as NewArrayExpression).Expressions)
                            {
                                m.TypeArguments.Add(CodeDom.GetTypeReference(CodeDom.Eval(e)));
                            }
                        }

                        return new CodeMethodInvokeExpression(m);
                    }
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.new")
                {
                    object t = CodeDom.Eval(methodCallExpression.Arguments[0]);
                    CodeTypeReference type = CodeDom.GetTypeReference(t);

                    if (methodCallExpression.Arguments.Count == 2)
                    {
                        NewArrayExpression arr = methodCallExpression.Arguments[1] as NewArrayExpression;
                        var exp = new CodeObjectCreateExpression(type);
                        foreach (Expression par in arr.Expressions)
                        {
                            AddParam(exp.Parameters, par);
                        }
                        return exp;
                    }
                    else
                        return new CodeObjectCreateExpression(type);
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.cast")
                {
                    object t = CodeDom.Eval(methodCallExpression.Arguments[0]);
                    CodeTypeReference type = CodeDom.GetTypeReference(t);

                    if (methodCallExpression.Method.IsGenericMethod && methodCallExpression.Method.GetGenericArguments()[0] == typeof(Var))
                    {
                        return new CodeDom.CodeWrapExpression(new CodeCastExpression(type, _Visit(methodCallExpression.Arguments[1])));
                    }
                    else
                        return new CodeCastExpression(type, _Visit(methodCallExpression.Arguments[1]));
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.default")
                {
                    object t = CodeDom.Eval(methodCallExpression.Arguments[0]);
                    CodeTypeReference type = CodeDom.GetTypeReference(t);
                    return new CodeDefaultValueExpression(type);
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.InjectExp")
                {
                    int num = CodeDom.Eval<int>(methodCallExpression.Arguments[0]);
                    return _ctx.Injections[num];
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.Is")
                {
                    return new CodeIdentityEqualityExpression(
                        true,
                        _Visit(methodCallExpression.Arguments[0]),
                        _Visit(methodCallExpression.Arguments[1])
                    );
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.IsNot")
                {
                    return new CodeIdentityEqualityExpression(
                        false,
                        _Visit(methodCallExpression.Arguments[0]),
                        _Visit(methodCallExpression.Arguments[1])
                    );
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.Lambda")
                {
                    if (methodCallExpression.Arguments[0].Type.IsArray)
                    {
                        List<LambdaParam> pars = new List<LambdaParam>();
                        foreach (LambdaParam lambdaParam in CodeDom.Eval<IEnumerable>(methodCallExpression.Arguments[0]))
                        {
                            pars.Add(lambdaParam);
                        }
                        List<CodeStatement> stmts = new List<CodeStatement>();
                        foreach (CodeStatement stmt in CodeDom.Eval<IEnumerable>(methodCallExpression.Arguments[1]))
                        {
                            stmts.Add(stmt);
                        }
                        return new CodeLambdaStatements(stmts, pars);
                    }
                    else
                    {
                        CodeExpression exp = _Visit(methodCallExpression.Arguments[0]);
                        List<LambdaParam> pars = new List<LambdaParam>();
                        if (methodCallExpression.Arguments.Count == 2)
                        {
                            NewArrayExpression arr = methodCallExpression.Arguments[1] as NewArrayExpression;
                            foreach (Expression par in arr.Expressions)
                            {
                                pars.Add(CodeDom.Eval<LambdaParam>(par));
                            }
                        }
                        return new CodeLambdaExpression(exp, pars);
                    }
                }
                else if (mr.MethodName == "LinqToCodedom.Generator.CodeDom.CallDelegate")
                {
                    CodeExpression target = null;
                    if (methodCallExpression.Arguments[0].Type == typeof(string))
                    {
                        target = new CodeVariableReferenceExpression(CodeDom.Eval<string>(methodCallExpression.Arguments[0]));
                    }
                    else
                    {
                        target = _Visit(methodCallExpression.Arguments[0]);
                    }

                    var d = new CodeDelegateInvokeExpression(target);

                    return d;
                }
            }

            var to = _Visit(methodCallExpression.Object);
            if (to is CodeDom.CodeThisExpression || to is CodeDom.CodeBaseExpression || to is CodeDom.CodeVarExpression || to is CodeDom.CodeWrapExpression)
            {
                CodeExpression rto = to is CodeDom.CodeThisExpression ?
                    new CodeThisReferenceExpression() :
                    to is CodeDom.CodeBaseExpression ?
                        new CodeBaseReferenceExpression() :
                        to is CodeVariableReferenceExpression ?
                        to as CodeVariableReferenceExpression :
                        to;

                switch (mr.MethodName)
                {
                    case "Call":
                    //case "CallFunction":
                        if (methodCallExpression.Arguments.Count > 0)
                        {
                            var m = new CodeMethodReferenceExpression(
                                rto,
                                CodeDom.Eval<string>(methodCallExpression.Arguments[0]));

                            if (methodCallExpression.Arguments.Count == 2)
                            {
                                foreach (Expression e in (methodCallExpression.Arguments[1] as NewArrayExpression).Expressions)
                                {
                                    m.TypeArguments.Add(CodeDom.GetTypeReference(CodeDom.Eval(e)));
                                }
                            }

                            return new CodeMethodInvokeExpression(m);
                        }
                        else
                        {
                            return new CodeDelegateInvokeExpression(rto);
                        }
                    case "Property":
                        string propertyName = CodeDom.Eval<string>(methodCallExpression.Arguments[0]);
                        if (methodCallExpression.Arguments.Count > 1)
                            throw new NotImplementedException();
                        return new CodeDom.CodeWrapExpression(new CodePropertyReferenceExpression(rto, propertyName));
                        //return new CodePropertyReferenceExpression(rto, propertyName);
                    case "Field":
                        string fieldName = CodeDom.Eval<string>(methodCallExpression.Arguments[0]);
                        if (methodCallExpression.Arguments.Count > 1)
                            throw new NotImplementedException();
                        return new CodeFieldReferenceExpression(rto, fieldName);
                    case "Raise":
                        string eventName = CodeDom.Eval<string>(methodCallExpression.Arguments[0]);
                        return new CodeDom.CodeDelegateArgsInvoke(
                            new CodeEventReferenceExpression(rto, eventName));
                    case "ArrayGet":
                        return new CodeArrayIndexerExpression(rto,
                            VisitExpressionList((methodCallExpression.Arguments[0] as NewArrayExpression).Expressions).ToArray()
                        );
                    case "JaggedArrayGet":
                        var n = methodCallExpression.Arguments[0] as NewArrayExpression;
                        CodeArrayIndexerExpression prev = null;
                        foreach (CodeExpression e in VisitExpressionList(n.Expressions.Reverse()))
                        {
                            if (prev == null)
                                prev = new CodeArrayIndexerExpression(rto, e);
                            else
                                prev = new CodeArrayIndexerExpression(prev, e);
                        }
                        return prev;
                    case "cast":
                        return rto;
                    default:
                        throw new NotImplementedException(mr.MethodName);
                }
            }
            //else if (to is CodeDom.CodeArgsInvoke)
            //{
            //    var c = to as CodeMethodInvokeExpression;
            //    c.Parameters.AddRange(VisitArguments(methodCallExpression.Arguments));
            //    //foreach (CodeExpression par in VisitSequence(
            //    //    new QueryVisitor((e) => e is LambdaExpression)
            //    //        .Visit(methodCallExpression.Arguments[0]) as LambdaExpression))
            //    //{
            //    //    c.Parameters.Add(par);
            //    //}
            //    return c;
            //}
            //else if (to is CodeDom.CodeDelegateArgsInvoke)
            //{
            //    var c = to as CodeDelegateInvokeExpression;
            //    c.Parameters.AddRange(VisitArguments(methodCallExpression.Arguments));
            //    //foreach (CodeExpression par in VisitSequence(
            //    //    new QueryVisitor((e) => e is LambdaExpression)
            //    //        .Visit(methodCallExpression.Arguments[0]) as LambdaExpression))
            //    //{
            //    //    c.Parameters.Add(par);
            //    //}
            //    return c;
            //}
            else
            {
                if ((methodCallExpression.Object != null && methodCallExpression.Object.Type.IsArray &&
                    mr.MethodName == "Get") ||
                    (mr.MethodName == "get_Item" && methodCallExpression.Method.IsSpecialName))
                {
                    var c = new CodeArrayIndexerExpression();
                    foreach (var par in methodCallExpression.Arguments)
                    {
                        AddParam(c.Indices, par);
                    }
                    c.TargetObject = to;
                    return c;
                }
                else
                {
                    var c = new CodeMethodInvokeExpression(mr);
                    foreach (var par in methodCallExpression.Arguments)
                    {
                        AddParam(c.Parameters, par);
                    }
                    c.Method.TargetObject = to;
                    return c;
                }
            }
        }
예제 #20
0
 /// <include file='doc\CSharpCodeProvider.uex' path='docs/doc[@for="CSharpCodeGenerator.GenerateDelegateInvokeExpression"]/*' />
 /// <devdoc>
 ///    <para>
 ///       Generates code for the specified CodeDom based delegate invoke
 ///       expression representation.
 ///    </para>
 /// </devdoc>
 protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e) {
     if (e.TargetObject != null) {
         GenerateExpression(e.TargetObject);
     }
     Output.Write("(");
     OutputExpressionList(e.Parameters);
     Output.Write(")");
 }
예제 #21
0
        /// <devdoc>
        ///    <para>
        ///       Generates code for the specified CodeDom based delegate invoke
        ///       expression.
        ///    </para>
        /// </devdoc>
        protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e) {
            if (e.TargetObject != null) {
                if (e.TargetObject is CodeEventReferenceExpression) {
                    Output.Write("RaiseEvent ");
                    GenerateFormalEventReferenceExpression((CodeEventReferenceExpression)e.TargetObject);
                }
                else {
                    GenerateExpression(e.TargetObject);
                }
            }

            CodeExpressionCollection parameters = e.Parameters;
            if (parameters.Count > 0) {
                Output.Write("(");
                OutputExpressionList(e.Parameters);
                Output.Write(")");
            }
        }
예제 #22
0
        private CodeStmtPair MakeWriteFieldStatements(Type type,
                                                      CodeExpression objExpr,
                                                      FieldInfo finfo,
                                                      CodeVariableReferenceExpression[] indexExprs)
        {
            CodeExpression writerExpr = new CodeArgumentReferenceExpression("writer");
            CodeExpression fieldExpr;
            if (finfo == null)
            {
                fieldExpr = new CodeArrayIndexerExpression(objExpr, indexExprs);
            }
            else
            {
                string fieldName = TypeSystem.FieldName(finfo.Name);
                if (finfo.IsPublic ||
                    (TypeSystem.IsBackingField(finfo.Name) &&
                     finfo.DeclaringType.GetProperty(fieldName, FieldFlags).GetGetMethod() != null))
                {
                    fieldExpr = new CodeFieldReferenceExpression(objExpr, fieldName);
                }
                else
                {
                    CodeExpression getterExpr = new CodeVariableReferenceExpression(
                                                        ExtensionClassName + "." + this.GetterFieldName(finfo));
                    if (finfo.DeclaringType.IsValueType)
                    {
                        objExpr = new CodeDirectionExpression(FieldDirection.Out, objExpr);
                    }
                    fieldExpr = new CodeDelegateInvokeExpression(getterExpr, objExpr);
                }
            }

            CodeExpression writeCall;
            if (GetBuiltinReaderName(type) == null)
            {
                // for non-builtin types
                string serializerName = GetStaticSerializerName(type);
                CodeVariableReferenceExpression serializerExpr = new CodeVariableReferenceExpression(serializerName);
                writeCall = new CodeMethodInvokeExpression(serializerExpr, "Write", writerExpr, fieldExpr);
            }
            else
            {
                // for builtin types
                writeCall = new CodeMethodInvokeExpression(writerExpr, "Write", fieldExpr);
            }
            CodeStatement stmt1 = new CodeExpressionStatement(writeCall);
            
            if (type.IsValueType)
            {
                return new CodeStmtPair(null, new CodeStatement[] { stmt1 });
            }
            else if (finfo == null)
            {
                if (StaticConfig.AllowNullArrayElements)
                {
                    string bvIndexString = indexExprs[0].VariableName;
                    for (int i = 1; i < indexExprs.Length; i++)
                    {
                        bvIndexString += "*" + indexExprs[i].VariableName;
                    }
                    CodeExpression bvIndex = new CodeSnippetExpression(bvIndexString);
                    CodeExpression nullExpr = new CodeMethodInvokeExpression(
                                                      new CodeTypeReferenceExpression("Object"),
                                                      "ReferenceEquals",
                                                      fieldExpr,
                                                      NullExpr);
                    CodeExpression bvExpr = new CodeArgumentReferenceExpression("bv");
                    CodeStatement stmt0 = new CodeExpressionStatement(
                                                  new CodeMethodInvokeExpression(bvExpr, "Set", bvIndex));
                    stmt0 = new CodeConditionStatement(nullExpr, stmt0);

                    CodeExpression notNullExpr = new CodeBinaryOperatorExpression(
                                                         new CodeIndexerExpression(bvExpr, bvIndex),
                                                         CodeBinaryOperatorType.IdentityEquality,
                                                         new CodePrimitiveExpression(false));
                    stmt1 = new CodeConditionStatement(notNullExpr, stmt1);
                    return new CodeStmtPair(new CodeStatement[] { stmt0 }, new CodeStatement[] { stmt1 });      
                }
                else
                {
                    return new CodeStmtPair(null, new CodeStatement[] { stmt1 });
                }
            }
            else
            {
                CodeExpression nullExpr = new CodeMethodInvokeExpression(
                                                  new CodeTypeReferenceExpression("Object"),
                                                  "ReferenceEquals",
                                                  fieldExpr,
                                                  NullExpr);
                if (AttributeSystem.FieldCanBeNull(finfo))
                {
                    CodeExpression bvExpr = new CodeArgumentReferenceExpression("bv");
                    CodeStatement stmt0 = new CodeExpressionStatement(
                                                  new CodeMethodInvokeExpression(bvExpr, "Set", indexExprs[0]));
                    stmt0 = new CodeConditionStatement(nullExpr, stmt0);
                    
                    CodeExpression notNullExpr = new CodeBinaryOperatorExpression(
                                                         new CodeIndexerExpression(bvExpr, indexExprs[0]),
                                                         CodeBinaryOperatorType.IdentityEquality,
                                                         new CodePrimitiveExpression(false));
                    stmt1 = new CodeConditionStatement(notNullExpr, stmt1);
                    return new CodeStmtPair(new CodeStatement[] { stmt0 }, new CodeStatement[] { stmt1 });
                }
                else
                {
                    // YY: For now we always check null
                    string msg = "Field " + finfo.DeclaringType.Name + "." + finfo.Name + " is null.";
                    CodeExpression msgExpr = new CodePrimitiveExpression(msg);
                    CodeExpression throwExpr = new CodeObjectCreateExpression(typeof(ArgumentNullException), msgExpr);
                    CodeStatement stmt0 = new CodeConditionStatement(nullExpr, new CodeThrowExceptionStatement(throwExpr));
                    return new CodeStmtPair(null, new CodeStatement[] { stmt0, stmt1 });                    
                }
            }
        }
 public void Generate(CodeDelegateInvokeExpression expression)
 {
     Generate(expression.TargetObject);
     Write(".Invoke");
     if (expression.Parameters.Count > 0)
     {
         Write("(");
         for (int i = 0; i < expression.Parameters.Count; i++)
         {
             Generate(expression.Parameters[i]);
             if (i != expression.Parameters.Count - 1)
                 Write(", ");
         }
         Write(")");
     }
 }
예제 #24
0
			public void Visit (CodeDelegateInvokeExpression o)
			{
				g.GenerateDelegateInvokeExpression (o);
			}
예제 #25
0
 private void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e)
 {
     if (e.TargetObject != null)
     {
         GenerateExpression(e.TargetObject);
     }
     Output.Write('(');
     OutputExpressionList(e.Parameters);
     Output.Write(')');
 }
예제 #26
0
		protected override void GenerateDelegateInvokeExpression (CodeDelegateInvokeExpression expression)
		{
			CodeEventReferenceExpression ev = expression.TargetObject as CodeEventReferenceExpression;
			
			if (ev != null) {
				Output.Write ("RaiseEvent ");
				if (ev.TargetObject != null && !(ev.TargetObject is CodeThisReferenceExpression)) {
					GenerateExpression (ev.TargetObject);
					Output.Write (".");
				}
				Output.Write (ev.EventName);
			} else if (expression.TargetObject != null) {
				GenerateExpression (expression.TargetObject);
			}
			Output.Write ('(');
			OutputExpressionList (expression.Parameters);
			Output.Write (')');
		}
예제 #27
0
 private void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e)
 {
     if (e.TargetObject != null)
     {
         this.GenerateExpression(e.TargetObject);
     }
     this.Output.Write("(");
     this.OutputExpressionList(e.Parameters);
     this.Output.Write(")");
 }
예제 #28
0
 protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e)
 {
     if (e.TargetObject != null)
     {
         if (e.TargetObject is CodeEventReferenceExpression)
         {
             base.Output.Write("RaiseEvent ");
             this.GenerateFormalEventReferenceExpression((CodeEventReferenceExpression)e.TargetObject);
         }
         else
         {
             base.GenerateExpression(e.TargetObject);
         }
     }
     if (e.Parameters.Count > 0)
     {
         base.Output.Write("(");
         this.OutputExpressionList(e.Parameters);
         base.Output.Write(")");
     }
 }
예제 #29
0
 /// <summary>
 /// Generates code for the specified delegate invoke expression.
 /// </summary>
 /// <remarks><c>TARGETOBJECT-&gt;Invoke(PARAMETERS)</c></remarks>
 protected override void GenerateDelegateInvokeExpression(CodeDelegateInvokeExpression e)
 {
     OutputInvocation(new CodeMethodReferenceExpression(e.TargetObject, SpecialWords.Invoke), e.Parameters);
 }
예제 #30
0
        /// <summary>
        /// Creates the property changed method.
        /// </summary>
        /// <returns>CodeMemberMethod on Property Change handler</returns>
        /// <remarks>
        /// <code>
        ///  protected virtual  void OnPropertyChanged(string info) {
        ///      PropertyChangedEventHandler handler = PropertyChanged;
        ///      if (handler != null) {
        ///          handler(this, new PropertyChangedEventArgs(info));
        ///      }
        ///  }
        /// </code>
        /// </remarks>
        internal static CodeMemberMethod CreatePropertyChangedMethod()
        {
            const string paramName = "propertyName";
            const string variableName = "handler";

            var propertyChangedMethod = new CodeMemberMethod
            {
                Name = "OnPropertyChanged",
                Attributes = MemberAttributes.Public
            };
            propertyChangedMethod.Parameters.Add(new CodeParameterDeclarationExpression(
                new CodeTypeReference(typeof(String)), paramName));

            if (GeneratorContext.GeneratorParams.TrackingChanges.Enabled && GeneratorContext.GeneratorParams.Language == GenerationLanguage.CSharp)
            {
                propertyChangedMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(object), "value"));
                // this.ChangeTracker.RecordCurrentValue(info, value);
                var changeTrackerParams = new CodeExpression[] { new CodeArgumentReferenceExpression(paramName), new CodeArgumentReferenceExpression(("value")) };
                var changeTrackerInvokeExpression = new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "ChangeTracker.RecordCurrentValue"), changeTrackerParams);
                propertyChangedMethod.Statements.Add(changeTrackerInvokeExpression);
            }

            //Declare temp variable holding the event
            var vardec = new CodeVariableDeclarationStatement(
                new CodeTypeReference(typeof(PropertyChangedEventHandler)), variableName);

            vardec.InitExpression = new CodeEventReferenceExpression(
                new CodeThisReferenceExpression(), "PropertyChanged");

            propertyChangedMethod.Statements.Add(vardec);

            //The part of the true, create the event and invoke it

            //var createArgs = new CodeObjectCreateExpression(
            //    new CodeTypeReference(typeof(PropertyChangedEventArgs)),
            //    new CodeArgumentReferenceExpression(paramName));

            var createArgs = CodeDomHelper.CreateInstance(typeof(PropertyChangedEventArgs), paramName);

            var raiseEvent = new CodeDelegateInvokeExpression(
                new CodeVariableReferenceExpression(variableName),
                new CodeThisReferenceExpression(), createArgs);

            //The Condition
            CodeExpression condition = new CodeBinaryOperatorExpression(
                new CodeVariableReferenceExpression(variableName),
                    CodeBinaryOperatorType.IdentityInequality,
                new CodePrimitiveExpression(null));

            //The if condition
            var ifTempIsNull = new CodeConditionStatement();
            ifTempIsNull.Condition = condition;
            ifTempIsNull.TrueStatements.Add(raiseEvent);

            propertyChangedMethod.Statements.Add(ifTempIsNull);
            return propertyChangedMethod;
        }
예제 #31
0
파일: Program.cs 프로젝트: 0x53A/Mvvm
        static void ImplementType(CodeCompileUnit unit, Type t, bool isAbstract)
        {
            var nspace = new CodeNamespace(t.Namespace + ".Generated");
            nspace.Imports.Add(new CodeNamespaceImport("System"));
            var type = new CodeTypeDeclaration(t.Name);
            type.IsClass = true;
            type.TypeAttributes = TypeAttributes.Public;
            type.BaseTypes.Add(t);

            var ctors = t.GetConstructors();
            foreach (var ctor in ctors)
            {
                var args = ctor.GetParameters();
                var _ctor = new CodeConstructor();
                _ctor.Attributes = MemberAttributes.Public;
                _ctor.Parameters.AddRange(args.Select(a => new CodeParameterDeclarationExpression(a.ParameterType, a.Name)).ToArray());
                _ctor.BaseConstructorArgs.AddRange(args.Select(a => new CodeVariableReferenceExpression(a.Name)).ToArray());
                type.Members.Add(_ctor);
            }

            var props = t.GetProperties();

            Func<PropertyInfo, bool> lazyFilter = null;
            Func<PropertyInfo, bool> InpcFilter = null;
            if (isAbstract)
            {
                lazyFilter = p => (p.GetMethod != null && p.SetMethod == null && p.GetMethod.IsAbstract);
                InpcFilter = p => (p.GetMethod != null && p.SetMethod != null && p.GetMethod.IsAbstract && p.SetMethod.IsAbstract);
            }
            else
            {
                lazyFilter = p => p.GetMethod != null && p.SetMethod == null;
                InpcFilter = p => p.GetMethod != null && p.SetMethod != null;
            }

            var lazy = props.Where(lazyFilter);
            var inpc = props.Where(InpcFilter).ToArray();
            foreach (var p in lazy)
            {
                ImplementProperty(type, p, isAbstract, isLazy: true);
            }
            if (inpc.Any())
            {
                type.BaseTypes.Add(typeof(INotifyPropertyChanged));
                CodeMemberEvent PropertyChangedEvent = new CodeMemberEvent();
                PropertyChangedEvent.Name = "PropertyChanged";
                PropertyChangedEvent.Type = new CodeTypeReference(typeof(PropertyChangedEventHandler));
                PropertyChangedEvent.Attributes = MemberAttributes.Public;
                type.Members.Add(PropertyChangedEvent);

                CodeMemberMethod OnPropertyChanged = new CodeMemberMethod();
                OnPropertyChanged.Name = "OnPropertyChanged";
                OnPropertyChanged.Attributes = MemberAttributes.Family;
                OnPropertyChanged.Parameters.Add(new CodeParameterDeclarationExpression(
                    new CodeTypeReference(typeof(String)), "Property"));

                //Declare temp variable holding the event
                CodeVariableDeclarationStatement vardec = new CodeVariableDeclarationStatement(
                    new CodeTypeReference(typeof(PropertyChangedEventHandler)), "temp");
                vardec.InitExpression = new CodeEventReferenceExpression(
                    new CodeThisReferenceExpression(), "PropertyChanged");
                OnPropertyChanged.Statements.Add(vardec);

                //The part of the true, create the event and invoke it
                CodeObjectCreateExpression createArgs = new CodeObjectCreateExpression(
                    new CodeTypeReference(typeof(PropertyChangedEventArgs)),
                    new CodeArgumentReferenceExpression("Property"));
                CodeDelegateInvokeExpression raiseEvent = new CodeDelegateInvokeExpression(
                    new CodeVariableReferenceExpression("temp"),
                    new CodeThisReferenceExpression(), createArgs);

                //The conditino
                CodeExpression condition = new CodeBinaryOperatorExpression(
                    new CodeVariableReferenceExpression("temp"),
                    CodeBinaryOperatorType.IdentityInequality,
                    new CodePrimitiveExpression(null));

                //The if condition
                CodeConditionStatement ifTempIsNull = new CodeConditionStatement();
                ifTempIsNull.Condition = condition;
                ifTempIsNull.TrueStatements.Add(raiseEvent);
                OnPropertyChanged.Statements.Add(ifTempIsNull);

                type.Members.Add(OnPropertyChanged);
                foreach (var p in inpc)
                    ImplementProperty(type, p, isAbstract, isLazy: false);
            }
            nspace.Types.Add(type);
            unit.Namespaces.Add(nspace);
        }