27
27
// Built-in methods => Prefix with class name
28
28
// Function A() \n A = SomeValue \n End Function -> convert to return statement
29
29
// Array creation => add 1 to upper bound to get array length
30
// Comparison with empty string literal -> string.IsNullOrEmpty
31
// Add default value to local variable declarations without initializer
34
/// Specifies whether the "Add default value to local variable declarations without initializer"
35
/// operation is executed by this convert visitor.
37
public bool AddDefaultValueInitializerToLocalVariableDeclarations = true;
31
39
Dictionary<string, string> usings;
32
40
List<UsingDeclaration> addedUsings;
100
108
if (se != null) {
101
109
InvocationExpression ie = se.Expression as InvocationExpression;
102
110
if (ie != null) {
103
FieldReferenceExpression fre = ie.TargetObject as FieldReferenceExpression;
104
if (fre != null && "New".Equals(fre.FieldName, StringComparison.InvariantCultureIgnoreCase)) {
111
MemberReferenceExpression fre = ie.TargetObject as MemberReferenceExpression;
112
if (fre != null && "New".Equals(fre.MemberName, StringComparison.InvariantCultureIgnoreCase)) {
105
113
if (fre.TargetObject is BaseReferenceExpression || fre.TargetObject is ClassReferenceExpression || fre.TargetObject is ThisReferenceExpression) {
106
114
body.Children.RemoveAt(0);
107
115
ConstructorInitializer ci = new ConstructorInitializer();
127
135
base.VisitUsingDeclaration(@using, data);
130
MethodDeclaration method = new MethodDeclaration(declareDeclaration.Name, declareDeclaration.Modifier,
131
declareDeclaration.TypeReference, declareDeclaration.Parameters,
132
declareDeclaration.Attributes);
138
MethodDeclaration method = new MethodDeclaration {
139
Name = declareDeclaration.Name,
140
Modifier = declareDeclaration.Modifier,
141
TypeReference = declareDeclaration.TypeReference,
142
Parameters = declareDeclaration.Parameters,
143
Attributes = declareDeclaration.Attributes
133
146
if ((method.Modifier & Modifiers.Visibility) == 0)
134
147
method.Modifier |= Modifiers.Public;
135
148
method.Modifier |= Modifiers.Extern | Modifiers.Static;
146
159
switch (declareDeclaration.Charset) {
147
160
case CharsetModifier.Auto:
148
161
att.NamedArguments.Add(new NamedArgumentExpression("CharSet",
149
new FieldReferenceExpression(new IdentifierExpression("CharSet"),
162
new MemberReferenceExpression(new IdentifierExpression("CharSet"),
152
165
case CharsetModifier.Unicode:
153
166
att.NamedArguments.Add(new NamedArgumentExpression("CharSet",
154
new FieldReferenceExpression(new IdentifierExpression("CharSet"),
167
new MemberReferenceExpression(new IdentifierExpression("CharSet"),
158
171
att.NamedArguments.Add(new NamedArgumentExpression("CharSet",
159
new FieldReferenceExpression(new IdentifierExpression("CharSet"),
172
new MemberReferenceExpression(new IdentifierExpression("CharSet"),
163
176
att.NamedArguments.Add(new NamedArgumentExpression("SetLastError", new PrimitiveExpression(true, true.ToString())));
164
177
att.NamedArguments.Add(new NamedArgumentExpression("ExactSpelling", new PrimitiveExpression(true, true.ToString())));
165
AttributeSection sec = new AttributeSection(null, null);
166
sec.Attributes.Add(att);
167
method.Attributes.Add(sec);
178
method.Attributes.Add(new AttributeSection { Attributes = { att } });
168
179
ReplaceCurrentNode(method);
169
180
return base.VisitMethodDeclaration(method, data);
196
207
InvocationExpression ie = se.Expression as InvocationExpression;
198
209
&& ie.Arguments.Count == 0
199
&& ie.TargetObject is FieldReferenceExpression
200
&& (ie.TargetObject as FieldReferenceExpression).TargetObject is BaseReferenceExpression
201
&& "Finalize".Equals((ie.TargetObject as FieldReferenceExpression).FieldName, StringComparison.InvariantCultureIgnoreCase))
210
&& ie.TargetObject is MemberReferenceExpression
211
&& (ie.TargetObject as MemberReferenceExpression).TargetObject is BaseReferenceExpression
212
&& "Finalize".Equals((ie.TargetObject as MemberReferenceExpression).MemberName, StringComparison.InvariantCultureIgnoreCase))
203
214
DestructorDeclaration des = new DestructorDeclaration("Destructor", Modifiers.None, methodDeclaration.Attributes);
204
215
ReplaceCurrentNode(des);
233
244
methodDeclaration.Body.AcceptVisitor(visitor, null);
234
245
if (visitor.replacementCount > 0) {
236
switch (methodDeclaration.TypeReference.SystemType) {
241
case "System.UInt16":
242
case "System.UInt32":
243
case "System.UInt64":
244
init = new PrimitiveExpression(0, "0");
246
case "System.Boolean":
247
init = new PrimitiveExpression(false, "false");
250
init = new PrimitiveExpression(null, "null");
247
init = GetDefaultValueForType(methodDeclaration.TypeReference);
253
248
methodDeclaration.Body.Children.Insert(0, new LocalVariableDeclaration(new VariableDeclaration(FunctionReturnValueName, init, methodDeclaration.TypeReference)));
254
249
methodDeclaration.Body.Children[0].Parent = methodDeclaration.Body;
255
250
methodDeclaration.Body.AddChild(new ReturnStatement(new IdentifierExpression(FunctionReturnValueName)));
332
327
from = p.ParameterName;
333
328
p.ParameterName = "Value";
335
propertyDeclaration.SetRegion.AcceptVisitor(new RenameIdentifierVisitor(from, "value"), null);
330
propertyDeclaration.SetRegion.AcceptVisitor(new RenameIdentifierVisitor(from, "value", StringComparer.InvariantCultureIgnoreCase), null);
338
333
return base.VisitPropertyDeclaration(propertyDeclaration, data);
341
class RenameIdentifierVisitor : AbstractAstVisitor
345
public RenameIdentifierVisitor(string from, string to)
351
public override object VisitIdentifierExpression(IdentifierExpression identifierExpression, object data)
353
if (string.Equals(identifierExpression.Identifier, from, StringComparison.InvariantCultureIgnoreCase)) {
354
identifierExpression.Identifier = to;
356
return base.VisitIdentifierExpression(identifierExpression, data);
360
336
static volatile Dictionary<string, Expression> constantTable;
361
337
static volatile Dictionary<string, Expression> methodTable;
388
364
if (constantTable.TryGetValue(identifierExpression.Identifier, out expr)) {
389
FieldReferenceExpression fre = new FieldReferenceExpression(expr, identifierExpression.Identifier);
365
MemberReferenceExpression fre = new MemberReferenceExpression(expr, identifierExpression.Identifier);
390
366
ReplaceCurrentNode(fre);
391
return base.VisitFieldReferenceExpression(fre, data);
367
return base.VisitMemberReferenceExpression(fre, data);
393
369
return base.VisitIdentifierExpression(identifierExpression, data);
474
450
return base.VisitArrayCreateExpression(arrayCreateExpression, data);
453
bool IsEmptyStringLiteral(Expression expression)
455
PrimitiveExpression pe = expression as PrimitiveExpression;
457
return (pe.Value as string) == "";
463
Expression CallStringIsNullOrEmpty(Expression stringVariable)
465
List<Expression> arguments = new List<Expression>();
466
arguments.Add(stringVariable);
467
return new InvocationExpression(
468
new MemberReferenceExpression(new TypeReferenceExpression("System.String"), "IsNullOrEmpty"),
472
public override object VisitBinaryOperatorExpression(BinaryOperatorExpression binaryOperatorExpression, object data)
474
base.VisitBinaryOperatorExpression(binaryOperatorExpression, data);
475
if (IsEmptyStringLiteral(binaryOperatorExpression.Right)) {
476
if (binaryOperatorExpression.Op == BinaryOperatorType.Equality) {
477
ReplaceCurrentNode(CallStringIsNullOrEmpty(binaryOperatorExpression.Left));
478
} else if (binaryOperatorExpression.Op == BinaryOperatorType.InEquality) {
479
ReplaceCurrentNode(new UnaryOperatorExpression(CallStringIsNullOrEmpty(binaryOperatorExpression.Left),
480
UnaryOperatorType.Not));
482
} else if (IsEmptyStringLiteral(binaryOperatorExpression.Left)) {
483
if (binaryOperatorExpression.Op == BinaryOperatorType.Equality) {
484
ReplaceCurrentNode(CallStringIsNullOrEmpty(binaryOperatorExpression.Right));
485
} else if (binaryOperatorExpression.Op == BinaryOperatorType.InEquality) {
486
ReplaceCurrentNode(new UnaryOperatorExpression(CallStringIsNullOrEmpty(binaryOperatorExpression.Right),
487
UnaryOperatorType.Not));
493
public override object VisitLocalVariableDeclaration(LocalVariableDeclaration localVariableDeclaration, object data)
495
if (AddDefaultValueInitializerToLocalVariableDeclarations) {
496
for (int i = 0; i < localVariableDeclaration.Variables.Count; i++) {
497
VariableDeclaration decl = localVariableDeclaration.Variables[i];
498
if (decl.FixedArrayInitialization.IsNull && decl.Initializer.IsNull) {
499
TypeReference type = localVariableDeclaration.GetTypeForVariable(i);
500
decl.Initializer = GetDefaultValueForType(type);
504
return base.VisitLocalVariableDeclaration(localVariableDeclaration, data);
507
Expression GetDefaultValueForType(TypeReference type)
509
if (type != null && !type.IsArrayType) {
510
switch (type.SystemType) {
514
case "System.UInt16":
516
case "System.UInt32":
518
case "System.UInt64":
519
case "System.Single":
520
case "System.Double":
521
return new PrimitiveExpression(0, "0");
523
return new PrimitiveExpression('\0', "'\\0'");
524
case "System.Object":
525
case "System.String":
526
return new PrimitiveExpression(null, "null");
527
case "System.Boolean":
528
return new PrimitiveExpression(false, "false");
530
return new DefaultValueExpression(type);
533
return new PrimitiveExpression(null, "null");