📄 codedomvisitor.cs
字号:
{
//TODO
return null;
}
public override object Visit(LoopControlVariableExpression loopControlVariableExpression, object data)
{
//TODO
return null;
}
public override object Visit(NamedArgumentExpression namedParameterExpression, object data)
{
//TODO
return null;
}
public override object Visit(UnaryOperatorExpression unaryOperatorExpression, object data)
{
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);
}
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) {
currentMethod.Statements.Add(new CodeAttachEventStatement(new CodeEventReferenceExpression(new CodeThisReferenceExpression(), ((IdentifierExpression)assignmentExpression.Left).Identifier),
methodInvoker));
} else {
FieldReferenceOrInvocationExpression fr = (FieldReferenceOrInvocationExpression)assignmentExpression.Left;
currentMethod.Statements.Add(new CodeAttachEventStatement(new CodeEventReferenceExpression((CodeExpression)fr.TargetObject.AcceptVisitor(this, data), fr.FieldName),
methodInvoker));
}
} else {
if (assignmentExpression.Left is IdentifierExpression) {
currentMethod.Statements.Add(new CodeAssignStatement((CodeExpression)assignmentExpression.Left.AcceptVisitor(this, null), (CodeExpression)assignmentExpression.Right.AcceptVisitor(this, null)));
} else {
currentMethod.Statements.Add(new CodeAssignStatement((CodeExpression)assignmentExpression.Left.AcceptVisitor(this, null), (CodeExpression)assignmentExpression.Right.AcceptVisitor(this, null)));
}
}
return null;
}
public override object Visit(AddressOfExpression addressOfExpression, object data)
{
if (addressOfExpression.Procedure is FieldReferenceOrInvocationExpression) {
FieldReferenceOrInvocationExpression fr = (FieldReferenceOrInvocationExpression)addressOfExpression.Procedure;
return new CodeObjectCreateExpression("System.EventHandler", new CodeExpression[] {
new CodeMethodReferenceExpression((CodeExpression)fr.TargetObject.AcceptVisitor(this, null),
fr.FieldName)
});
}
return addressOfExpression.Procedure.AcceptVisitor(this, null);
}
public override object Visit(TypeOfExpression typeOfExpression, object data)
{
return new CodeTypeOfExpression(ConvType(typeOfExpression.Type.Type));
}
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(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) {
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),
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(FieldReferenceOrInvocationExpression 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.ToUpper(System.Globalization.CultureInfo.InvariantCulture) == field.Name.ToUpper(System.Globalization.CultureInfo.InvariantCulture)) {
return true;
}
}
}
}
}
return false; //Char.IsLower(fieldReferenceExpression.FieldName[0]);
}
public override object Visit(FieldReferenceOrInvocationExpression 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 FieldReferenceOrInvocationExpression) {
if (IsQualIdent((FieldReferenceOrInvocationExpression)fieldReferenceExpression.TargetObject)) {
CodeTypeReferenceExpression typeRef = ConvertToIdentifier((FieldReferenceOrInvocationExpression)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(ArrayInitializerExpression arrayInitializerExpression, object data)
{
return null;
}
#endregion
bool IsQualIdent(FieldReferenceOrInvocationExpression fieldReferenceExpression)
{
while (fieldReferenceExpression.TargetObject is FieldReferenceOrInvocationExpression) {
fieldReferenceExpression = (FieldReferenceOrInvocationExpression)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(FieldReferenceOrInvocationExpression fieldReferenceExpression)
{
string type = String.Empty;
while (fieldReferenceExpression.TargetObject is FieldReferenceOrInvocationExpression) {
type = "." + fieldReferenceExpression.FieldName + type;
fieldReferenceExpression = (FieldReferenceOrInvocationExpression)fieldReferenceExpression.TargetObject;
}
type = "." + fieldReferenceExpression.FieldName + type;
if (fieldReferenceExpression.TargetObject is IdentifierExpression) {
type = ((IdentifierExpression)fieldReferenceExpression.TargetObject).Identifier + type;
string oldType = type;
int idx = type.LastIndexOf('.');
while (idx >= 0) {
if (Type.GetType(type) != null) {
break;
}
type = type.Substring(0, idx) + "+" + type.Substring(idx + 1);
idx = type.LastIndexOf('.');
}
if (Type.GetType(type) == null) {
type = oldType;
}
return new CodeTypeReferenceExpression(type);
} else {
throw new Exception();
}
}
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) {
if (expressionList[i] != null) {
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 + -