/// <inheritdoc/> protected override bool HandleDynamic(CodeBinaryOperatorExpressionMore obj, Context ctx) { WrapIfNecessaryAndHandle(obj.LeftExpression, ctx); ctx.Writer.Write($" {CSharpKeywordsUtils.OperatorSymbol(obj.OperatorType)} "); WrapIfNecessaryAndHandle(obj.RightExpression, ctx); return(true); }
/// <inheritdoc /> protected override bool HandleDynamic(CodeUnaryOperatorExpression obj, Context ctx) { string operatorSymbol = VisualBasicKeywordsUtils.UnaryOperatorSymbol(obj.Operator); if (operatorSymbol != null) { ctx.Writer.Write(operatorSymbol); WrapIfNecessaryAndHandle(obj.Expression, ctx); return(true); } if (obj.Operator == CodeUnaryOperatorType.PostDecrement || obj.Operator == CodeUnaryOperatorType.PostIncrement || obj.Operator == CodeUnaryOperatorType.PreDecrement || obj.Operator == CodeUnaryOperatorType.PreIncrement) { //TODO this is ok when used as an expression, but not when used as a statement. Should be replaced with a method invocation, and add a library bool isIncrement = obj.Operator == CodeUnaryOperatorType.PostIncrement || obj.Operator == CodeUnaryOperatorType.PreIncrement; bool isPre = obj.Operator == CodeUnaryOperatorType.PreDecrement || obj.Operator == CodeUnaryOperatorType.PreIncrement; CodeExpression toReturn; if (isPre) { toReturn = obj.Expression; } else { toReturn = new CodeBinaryOperatorExpressionMore( obj.Expression, isIncrement ? CodeBinaryOperatorTypeMore.Subtract : CodeBinaryOperatorTypeMore.Add, Primitives.Int(1)); } var lambda = new CodeLambdaDeclarationExpression( new CodeCommentStatement(obj.Operator.ToString("G")), new CodeOperationAssignmentStatement( obj.Expression, isIncrement ? CodeBinaryOperatorTypeMore.Add : CodeBinaryOperatorTypeMore.Subtract, Primitives.Int(1)), new CodeMethodReturnStatement(toReturn)); ctx.HandlerProvider.ExpressionHandler.Handle(new CodeMethodInvokeExpression(lambda, "Invoke"), ctx); return(true); } return(false); }
/// <inheritdoc /> protected override bool HandleDynamic(CodeBinaryOperatorExpressionMore obj, Context ctx) { if (obj.OperatorType == CodeBinaryOperatorTypeMore.NullCoalescing) { ctx.Writer.Write("If("); ctx.HandlerProvider.ExpressionHandler.Handle(obj.LeftExpression, ctx); ctx.Writer.Write(", "); ctx.HandlerProvider.ExpressionHandler.Handle(obj.RightExpression, ctx); ctx.Writer.Write(")"); } else { WrapIfNecessaryAndHandle(obj.LeftExpression, ctx); ctx.Writer.Write($" {VisualBasicKeywordsUtils.OperatorSymbol(obj.OperatorType)} "); WrapIfNecessaryAndHandle(obj.RightExpression, ctx); } return(true); }
/// <inheritdoc cref="ICodeObjectHandler{T}.Handle"/> protected abstract bool HandleDynamic(CodeBinaryOperatorExpressionMore obj, Context ctx);