📄 codedomoutputvisitor.cs
字号:
{
throw new NotSupportedException("CodeDom does not support Fixed Statement");
}
#region Expressions
public override object VisitPrimitiveExpression(PrimitiveExpression primitiveExpression, object data)
{
return new CodePrimitiveExpression(primitiveExpression.Value);
}
public override object VisitBinaryOperatorExpression(BinaryOperatorExpression binaryOperatorExpression, object data)
{
CodeBinaryOperatorType op = CodeBinaryOperatorType.Add;
switch (binaryOperatorExpression.Op) {
case BinaryOperatorType.Add:
op = CodeBinaryOperatorType.Add;
break;
case BinaryOperatorType.BitwiseAnd:
op = CodeBinaryOperatorType.BitwiseAnd;
break;
case BinaryOperatorType.BitwiseOr:
op = CodeBinaryOperatorType.BitwiseOr;
break;
case BinaryOperatorType.LogicalAnd:
op = CodeBinaryOperatorType.BooleanAnd;
break;
case BinaryOperatorType.LogicalOr:
op = CodeBinaryOperatorType.BooleanOr;
break;
case BinaryOperatorType.Divide:
case BinaryOperatorType.DivideInteger:
op = CodeBinaryOperatorType.Divide;
break;
case BinaryOperatorType.GreaterThan:
op = CodeBinaryOperatorType.GreaterThan;
break;
case BinaryOperatorType.GreaterThanOrEqual:
op = CodeBinaryOperatorType.GreaterThanOrEqual;
break;
case BinaryOperatorType.Equality:
op = CodeBinaryOperatorType.IdentityEquality;
break;
case BinaryOperatorType.InEquality:
op = CodeBinaryOperatorType.IdentityInequality;
break;
case BinaryOperatorType.LessThan:
op = CodeBinaryOperatorType.LessThan;
break;
case BinaryOperatorType.LessThanOrEqual:
op = CodeBinaryOperatorType.LessThanOrEqual;
break;
case BinaryOperatorType.Modulus:
op = CodeBinaryOperatorType.Modulus;
break;
case BinaryOperatorType.Multiply:
op = CodeBinaryOperatorType.Multiply;
break;
case BinaryOperatorType.Subtract:
op = CodeBinaryOperatorType.Subtract;
break;
//case BinaryOperatorType.ValueEquality:
// op = CodeBinaryOperatorType.ValueEquality;
// break;
case BinaryOperatorType.ShiftLeft:
case BinaryOperatorType.ShiftRight:
// CodeDOM suxx
op = CodeBinaryOperatorType.Multiply;
break;
case BinaryOperatorType.ReferenceEquality:
op = CodeBinaryOperatorType.IdentityEquality;
break;
case BinaryOperatorType.ReferenceInequality:
op = CodeBinaryOperatorType.IdentityInequality;
break;
case BinaryOperatorType.ExclusiveOr:
// TODO ExclusiveOr
op = CodeBinaryOperatorType.BitwiseAnd;
break;
}
System.Diagnostics.Debug.Assert(!binaryOperatorExpression.Left.IsNull);
System.Diagnostics.Debug.Assert(!binaryOperatorExpression.Right.IsNull);
return new CodeBinaryOperatorExpression((CodeExpression)binaryOperatorExpression.Left.AcceptVisitor(this, data),
op,
(CodeExpression)binaryOperatorExpression.Right.AcceptVisitor(this, data));
}
public override object VisitParenthesizedExpression(ParenthesizedExpression parenthesizedExpression, object data)
{
return parenthesizedExpression.Expression.AcceptVisitor(this, data);
}
public override object VisitInvocationExpression(InvocationExpression invocationExpression, object data)
{
Expression target = invocationExpression.TargetObject;
CodeExpression targetExpr;
string methodName = null;
if (target == null) {
targetExpr = new CodeThisReferenceExpression();
} else if (target is FieldReferenceExpression) {
FieldReferenceExpression fRef = (FieldReferenceExpression)target;
targetExpr = null;
if (fRef.TargetObject is FieldReferenceExpression) {
if (IsPossibleTypeReference((FieldReferenceExpression)fRef.TargetObject)) {
targetExpr = ConvertToTypeReference((FieldReferenceExpression)fRef.TargetObject);
}
}
if (targetExpr == null)
targetExpr = (CodeExpression)fRef.TargetObject.AcceptVisitor(this, data);
methodName = fRef.FieldName;
// HACK for : Microsoft.VisualBasic.ChrW(NUMBER)
if (methodName == "ChrW") {
return new CodeCastExpression("System.Char", GetExpressionList(invocationExpression.Arguments)[0]);
}
} else if (target is IdentifierExpression) {
targetExpr = new CodeThisReferenceExpression();
methodName = ((IdentifierExpression)target).Identifier;
} else {
targetExpr = (CodeExpression)target.AcceptVisitor(this, data);
}
return new CodeMethodInvokeExpression(targetExpr, methodName, GetExpressionList(invocationExpression.Arguments));
}
public override object VisitIdentifierExpression(IdentifierExpression identifierExpression, object data)
{
if (!IsLocalVariable(identifierExpression.Identifier) && IsField(identifierExpression.Identifier)) {
return new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), identifierExpression.Identifier);
}
return new CodeVariableReferenceExpression(identifierExpression.Identifier);
}
public override object VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression, object data)
{
CodeExpression var;
CodeAssignStatement assign;
switch (unaryOperatorExpression.Op) {
case UnaryOperatorType.Minus:
if (unaryOperatorExpression.Expression is PrimitiveExpression) {
PrimitiveExpression expression = (PrimitiveExpression)unaryOperatorExpression.Expression;
if (expression.Value is int) {
return new CodePrimitiveExpression(- (int)expression.Value);
}
if (expression.Value is System.UInt32 || expression.Value is System.UInt16) {
return new CodePrimitiveExpression(Int32.Parse("-" + expression.StringValue));
}
if (expression.Value is long) {
return new CodePrimitiveExpression(- (long)expression.Value);
}
if (expression.Value is double) {
return new CodePrimitiveExpression(- (double)expression.Value);
}
if (expression.Value is float) {
return new CodePrimitiveExpression(- (float)expression.Value);
}
}
return new CodeBinaryOperatorExpression(new CodePrimitiveExpression(0),
CodeBinaryOperatorType.Subtract,
(CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data));
case UnaryOperatorType.Plus:
return unaryOperatorExpression.Expression.AcceptVisitor(this, data);
case UnaryOperatorType.PostIncrement:
// emulate i++, with i = i + 1
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
assign = new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Add,
new CodePrimitiveExpression(1)));
AddStmt(assign);
return assign;
//return new CodeAssignStatement(var,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Add,
// new CodePrimitiveExpression(1)));
// RG: needs to return an Expression - Not a Statement
//return new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Assign,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Add,
// new CodePrimitiveExpression(1)));
case UnaryOperatorType.PostDecrement:
// emulate i--, with i = i - 1
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
assign = new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression(1)));
AddStmt(assign);
return assign;
//return new CodeAssignStatement(var,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Subtract,
// new CodePrimitiveExpression(1)));
// RG: needs to return an Expression - Not a Statement
//return new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Assign,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Subtract,
// new CodePrimitiveExpression(1)));
case UnaryOperatorType.Decrement:
// emulate --i, with i = i - 1
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
assign = new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression(1)));
AddStmt(assign);
return assign;
//return new CodeAssignStatement(var,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Subtract,
// new CodePrimitiveExpression(1)));
//return new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Assign,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Subtract,
// new CodePrimitiveExpression(1)));
case UnaryOperatorType.Increment:
// emulate ++i, with i = i + 1
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
assign = new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Add,
new CodePrimitiveExpression(1)));
AddStmt(assign);
return assign;
//return new CodeAssignStatement(var,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Add,
// new CodePrimitiveExpression(1)));
//return new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Assign,
// new CodeBinaryOperatorExpression(var,
// CodeBinaryOperatorType.Add,
// new CodePrimitiveExpression(1)));
// RG:
case UnaryOperatorType.Not:
// emulate !a with a == false
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
return new CodeBinaryOperatorExpression(var,CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(false));
default:
throw new NotSupportedException("CodeDom does not support Unary Operators");
}
}
bool methodReference = false;
void AddEventHandler(Expression eventExpr, Expression handler, object data)
{
methodReference = true;
CodeExpression methodInvoker = (CodeExpression)handler.AcceptVisitor(this, data);
methodReference = false;
if (!(methodInvoker is CodeObjectCreateExpression)) {
// we need to create an event handler here
methodInvoker = new CodeObjectCreateExpression(new CodeTypeReference("System.EventHandler"), methodInvoker);
}
if (eventExpr is IdentifierExpression) {
AddStmt(new CodeAttachEventStatement(new CodeEventReferenceExpression(new CodeThisReferenceExpression(), ((IdentifierExpression)eventExpr).Identifier),
methodInvoker));
} else {
FieldReferenceExpression fr = (FieldReferenceExpression)eventExpr;
AddStmt(new CodeAttachEventStatement(new CodeEventReferenceExpression((CodeExpression)fr.TargetObject.AcceptVisitor(this, data), fr.FieldName),
methodInvoker));
}
}
public override object VisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
{
if (assignmentExpression.Op == AssignmentOperatorType.Add) {
AddEventHandler(assignmentExpression.Left, assignmentExpression.Right, data);
} else {
if (assignmentExpression.Left is IdentifierExpression) {
AddStmt(new CodeAssignStatement((CodeExpression)assignmentExpression.Left.AcceptVisitor(this, null), (CodeExpression)assignmentExpression.Right.AcceptVisitor(this, null)));
} else {
AddStmt(new CodeAssignStatement((CodeExpression)assignmentExpression.Left.AcceptVisitor(this, null), (CodeExpression)assignmentExpression.Right.AcceptVisitor(this, null)));
}
}
return null;
}
public override object VisitAddHandlerStatement(AddHandlerStatement addHandlerStatement, object data)
{
AddEventHandler(addHandlerStatement.EventExpression, addHandlerStatement.HandlerExpression, data);
return null;
}
public override object VisitAddressOfExpression(AddressOfExpression addressOfExpression, object data)
{
return addressOfExpression.Expression.AcceptVisitor(this, data);
}
public override object VisitUsing(Using @using, object data)
{
return base.VisitUsing(@using, data);
}
// RG
int usingId = 0;
public override object VisitUsingStatement(UsingStatement usingStatement, object data)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -