📄 codedomvisitor.cs
字号:
targetExpr = (CodeExpression)target.AcceptVisitor(this, data);
}
return new CodeMethodInvokeExpression(targetExpr, methodName, GetExpressionList(invocationExpression.Parameters));
}
public override object Visit(IdentifierExpression expression, object data)
{
if (IsField(expression.Identifier)) {
return new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),
expression.Identifier);
}
return new CodeVariableReferenceExpression(expression.Identifier);
}
public override object Visit(TypeReferenceExpression typeReferenceExpression, object data)
{
return null;
}
public override object Visit(UnaryOperatorExpression unaryOperatorExpression, object data)
{
CodeExpression var;
switch (unaryOperatorExpression.Op) {
case UnaryOperatorType.Minus:
if (unaryOperatorExpression.Expression is PrimitiveExpression) {
PrimitiveExpression expression = (PrimitiveExpression)unaryOperatorExpression.Expression;
if (expression.Value is System.UInt32 || expression.Value is System.UInt16) {
return new CodePrimitiveExpression(Int32.Parse("-" + expression.StringValue));
}
if (expression.Value is int) {
return new CodePrimitiveExpression(- (int)expression.Value);
}
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);
return new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Add,
new CodePrimitiveExpression(1)));
case UnaryOperatorType.PostDecrement:
// emulate i--, with i = i - 1
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
return new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression(1)));
case UnaryOperatorType.Decrement:
// emulate --i, with i = i - 1
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
return new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Subtract,
new CodePrimitiveExpression(1)));
case UnaryOperatorType.Increment:
// emulate ++i, with i = i + 1
var = (CodeExpression)unaryOperatorExpression.Expression.AcceptVisitor(this, data);
return new CodeAssignStatement(var,
new CodeBinaryOperatorExpression(var,
CodeBinaryOperatorType.Add,
new CodePrimitiveExpression(1)));
}
return null;
}
bool methodReference = false;
public override object Visit(AssignmentExpression assignmentExpression, object data)
{
if (assignmentExpression.Op == AssignmentOperatorType.Add) {
methodReference = true;
CodeExpression methodInvoker = (CodeExpression)assignmentExpression.Right.AcceptVisitor(this, null);
methodReference = false;
if (assignmentExpression.Left is IdentifierExpression) {
AddStmt(new CodeAttachEventStatement(new CodeEventReferenceExpression(new CodeThisReferenceExpression(), ((IdentifierExpression)assignmentExpression.Left).Identifier),
methodInvoker));
} else {
FieldReferenceExpression fr = (FieldReferenceExpression)assignmentExpression.Left;
AddStmt(new CodeAttachEventStatement(new CodeEventReferenceExpression((CodeExpression)fr.TargetObject.AcceptVisitor(this, data), fr.FieldName),
methodInvoker));
}
} 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 Visit(CheckedStatement checkedStatement, object data)
{
return null;
}
public override object Visit(UncheckedStatement uncheckedStatement, object data)
{
return null;
}
public override object Visit(SizeOfExpression sizeOfExpression, object data)
{
return null;
}
public override object Visit(TypeOfExpression typeOfExpression, object data)
{
return new CodeTypeOfExpression(ConvType(typeOfExpression.TypeReference.Type));
}
public override object Visit(CheckedExpression checkedExpression, object data)
{
return null;
}
public override object Visit(UncheckedExpression uncheckedExpression, object data)
{
return null;
}
public override object Visit(PointerReferenceExpression pointerReferenceExpression, object data)
{
return null;
}
public override object Visit(CastExpression castExpression, object data)
{
string typeRef = ConvType(castExpression.CastTo.Type);
return new CodeCastExpression(typeRef, (CodeExpression)castExpression.Expression.AcceptVisitor(this, data));
}
public override object Visit(StackAllocExpression stackAllocExpression, object data)
{
// TODO
return null;
}
public override object Visit(IndexerExpression indexerExpression, object data)
{
return new CodeIndexerExpression((CodeExpression)indexerExpression.TargetObject.AcceptVisitor(this, data), GetExpressionList(indexerExpression.Indices));
}
public override object Visit(ThisReferenceExpression thisReferenceExpression, object data)
{
return new CodeThisReferenceExpression();
}
public override object Visit(BaseReferenceExpression baseReferenceExpression, object data)
{
return new CodeBaseReferenceExpression();
}
public override object Visit(ArrayCreateExpression arrayCreateExpression, object data)
{
if (arrayCreateExpression.ArrayInitializer == null) {
if (arrayCreateExpression.Rank != null && arrayCreateExpression.Rank.Length > 0) {
return new CodeArrayCreateExpression(ConvType(arrayCreateExpression.CreateType.Type),
arrayCreateExpression.Rank[0]);
}
return new CodeArrayCreateExpression(ConvType(arrayCreateExpression.CreateType.Type),
0);
}
return new CodeArrayCreateExpression(ConvType(arrayCreateExpression.CreateType.Type),
GetExpressionList(arrayCreateExpression.ArrayInitializer.CreateExpressions));
}
public override object Visit(ObjectCreateExpression objectCreateExpression, object data)
{
return new CodeObjectCreateExpression(ConvType(objectCreateExpression.CreateType.Type),
objectCreateExpression.Parameters == null ? null : GetExpressionList(objectCreateExpression.Parameters));
}
public override object Visit(ParameterDeclarationExpression parameterDeclarationExpression, object data)
{
return new CodeParameterDeclarationExpression(new CodeTypeReference(ConvType(parameterDeclarationExpression.TypeReference.Type)), parameterDeclarationExpression.ParameterName);
}
bool IsField(string type, string fieldName)
{
Type t = null;
Assembly asm = null;
t = this.GetType(type);
if (t == null) {
asm = typeof(System.Drawing.Point).Assembly;
t = asm.GetType(type);
}
if (t == null) {
asm = typeof(System.Windows.Forms.Control).Assembly;
t = asm.GetType(type);
}
if (t == null) {
asm = typeof(System.String).Assembly;
t = asm.GetType(type);
}
bool isField = t != null && (t.IsEnum || t.GetField(fieldName) != null);
if (!isField) {
int idx = type.LastIndexOf('.');
if (idx >= 0) {
type = type.Substring(0, idx) + "+" + type.Substring(idx + 1);
isField = IsField(type, fieldName);
}
}
return isField;
}
bool IsFieldReferenceExpression(FieldReferenceExpression fieldReferenceExpression)
{
if (fieldReferenceExpression.TargetObject is ThisReferenceExpression) {
foreach (object o in this.currentTypeDeclaration.Children) {
if (o is FieldDeclaration) {
FieldDeclaration fd = (FieldDeclaration)o;
foreach (VariableDeclaration field in fd.Fields) {
if (fieldReferenceExpression.FieldName == field.Name) {
return true;
}
}
}
}
}
return false; //Char.IsLower(fieldReferenceExpression.FieldName[0]);
}
public override object Visit(FieldReferenceExpression fieldReferenceExpression, object data)
{
if (methodReference) {
methodReference = false;
return new CodeMethodReferenceExpression((CodeExpression)fieldReferenceExpression.TargetObject.AcceptVisitor(this, data), fieldReferenceExpression.FieldName);
}
if (IsFieldReferenceExpression(fieldReferenceExpression)) {
return new CodeFieldReferenceExpression((CodeExpression)fieldReferenceExpression.TargetObject.AcceptVisitor(this, data),
fieldReferenceExpression.FieldName);
} else {
if (fieldReferenceExpression.TargetObject is FieldReferenceExpression) {
if (IsQualIdent((FieldReferenceExpression)fieldReferenceExpression.TargetObject)) {
CodeTypeReferenceExpression typeRef = ConvertToIdentifier((FieldReferenceExpression)fieldReferenceExpression.TargetObject);
if (IsField(typeRef.Type.BaseType, fieldReferenceExpression.FieldName)) {
return new CodeFieldReferenceExpression(typeRef,
fieldReferenceExpression.FieldName);
} else {
return new CodePropertyReferenceExpression(typeRef,
fieldReferenceExpression.FieldName);
}
}
}
CodeExpression codeExpression = (CodeExpression)fieldReferenceExpression.TargetObject.AcceptVisitor(this, data);
return new CodePropertyReferenceExpression(codeExpression,
fieldReferenceExpression.FieldName);
}
}
public override object Visit(DirectionExpression directionExpression, object data)
{
return null;
}
public override object Visit(ArrayInitializerExpression arrayInitializerExpression, object data)
{
return null;
}
public override object Visit(ConditionalExpression conditionalExpression, object data)
{
return null;
}
#endregion
bool IsQualIdent(FieldReferenceExpression fieldReferenceExpression)
{
while (fieldReferenceExpression.TargetObject is FieldReferenceExpression) {
fieldReferenceExpression = (FieldReferenceExpression)fieldReferenceExpression.TargetObject;
}
return fieldReferenceExpression.TargetObject is IdentifierExpression;
}
bool IsField(string identifier)
{
foreach (INode node in currentTypeDeclaration.Children) {
if (node is FieldDeclaration) {
FieldDeclaration fd = (FieldDeclaration)node;
if (fd.GetVariableDeclaration(identifier) != null) {
return true;
}
}
}
return false;
}
CodeTypeReferenceExpression ConvertToIdentifier(FieldReferenceExpression fieldReferenceExpression)
{
StringBuilder type = new StringBuilder("");
while (fieldReferenceExpression.TargetObject is FieldReferenceExpression) {
type.Insert(0,'.');
type.Insert(1,fieldReferenceExpression.FieldName.ToCharArray());
fieldReferenceExpression = (FieldReferenceExpression)fieldReferenceExpression.TargetObject;
}
type.Insert(0,'.');
type.Insert(1,fieldReferenceExpression.FieldName.ToCharArray());
if (fieldReferenceExpression.TargetObject is IdentifierExpression) {
type.Insert(0, ((IdentifierExpression)fieldReferenceExpression.TargetObject).Identifier.ToCharArray());
string oldType = type.ToString();
int idx = oldType.LastIndexOf('.');
while (idx > 0) {
if (Type.GetType(type.ToString()) != null) {
break;
}
string stype = type.ToString().Substring(idx + 1);
type = new StringBuilder(type.ToString().Substring(0, idx));
type.Append("+");
type.Append(stype);
idx = type.ToString().LastIndexOf('.');
}
if (Type.GetType(type.ToString()) == null) {
type = new StringBuilder(oldType);
}
return new CodeTypeReferenceExpression(type.ToString());
} else {
return null;
}
}
CodeExpression[] GetExpressionList(ArrayList expressionList)
{
if (expressionList == null) {
return new CodeExpression[0];
}
CodeExpression[] list = new CodeExpression[expressionList.Count];
for (int i = 0; i < expressionList.Count; ++i) {
list[i] = (CodeExpression)((Expression)expressionList[i]).AcceptVisitor(this, null);
if (list[i] == null) {
list[i] = new CodePrimitiveExpression(0);
}
}
return list;
}
Type GetType(string typeName)
{
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
Type type = asm.GetType(typeName);
if (type != null)
{
return type;
}
}
return Type.GetType(typeName);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -