void ReplaceAllFunctionAssignments(BlockStatement block, string functionName, TypeReference typeReference) { ReturnStatementForFunctionAssignment visitor = new ReturnStatementForFunctionAssignment(functionName); block.AcceptVisitor(visitor, null); if (visitor.expressionsToReplace.Count == 1 && !visitor.hasExit && IsAssignmentTo(block.Children.Last(), functionName)) { Expression returnValue = GetAssignmentFromStatement(block.Children.Last()).Right; block.Children.RemoveAt(block.Children.Count - 1); block.Return(returnValue); } else { if (visitor.expressionsToReplace.Count > 0) { foreach (var expr in visitor.expressionsToReplace) { expr.Identifier = FunctionReturnValueName; } Expression init; init = ExpressionBuilder.CreateDefaultValueForType(typeReference); block.Children.Insert(0, new LocalVariableDeclaration(new VariableDeclaration(FunctionReturnValueName, init, typeReference))); block.Children[0].Parent = block; block.Return(new IdentifierExpression(FunctionReturnValueName)); } } }
public virtual PropertyDeclaration CreateProperty(IField field, bool createGetter, bool createSetter) { ClassFinder targetContext = new ClassFinder(field); string name = GetPropertyName(field.Name); PropertyDeclaration property = new PropertyDeclaration(ConvertModifier(field.Modifiers, targetContext), null, name, null); property.TypeReference = ConvertType(field.ReturnType, new ClassFinder(field)); if (createGetter) { BlockStatement block = new BlockStatement(); block.Return(new IdentifierExpression(field.Name)); property.GetRegion = new PropertyGetRegion(block, null); } if (createSetter) { BlockStatement block = new BlockStatement(); block.Assign(new IdentifierExpression(field.Name), new IdentifierExpression("value")); property.SetRegion = new PropertySetRegion(block, null); } property.Modifier = Modifiers.Public | (property.Modifier & Modifiers.Static); return(property); }
INode InitStaticVariable(string initFieldName, string variableName, Expression initializer, TypeDeclaration typeDeclaration) { const string helperMethodName = "InitStaticVariableHelper"; if (typeDeclaration != null) { if (!typeDeclaration.Children.OfType <MethodDeclaration>().Any(m => m.Name == helperMethodName)) { // add helper method var helperMethod = new MethodDeclaration { Name = helperMethodName, Modifier = Modifiers.Static, TypeReference = new TypeReference("System.Boolean", true), Parameters = { new ParameterDeclarationExpression(new TypeReference("Microsoft.VisualBasic.CompilerServices.StaticLocalInitFlag"), "flag") }, Body = new BlockStatement() }; BlockStatement trueBlock = new BlockStatement(); BlockStatement elseIfBlock = new BlockStatement(); BlockStatement falseBlock = new BlockStatement(); helperMethod.Body.AddStatement( new IfElseStatement(ExpressionBuilder.Identifier("flag").Member("State").Operator(BinaryOperatorType.Equality, new PrimitiveExpression(0))) { TrueStatement = { trueBlock }, ElseIfSections = { new ElseIfSection(ExpressionBuilder.Identifier("flag").Member("State").Operator(BinaryOperatorType.Equality, new PrimitiveExpression(2)), elseIfBlock) }, FalseStatement = { falseBlock } }); trueBlock.Assign(ExpressionBuilder.Identifier("flag").Member("State"), new PrimitiveExpression(2)); trueBlock.Return(new PrimitiveExpression(true)); elseIfBlock.Throw(new TypeReference("Microsoft.VisualBasic.CompilerServices.IncompleteInitialization").New()); falseBlock.Return(new PrimitiveExpression(false)); typeDeclaration.AddChild(helperMethod); } } BlockStatement tryBlock = new BlockStatement(); BlockStatement ifTrueBlock = new BlockStatement(); tryBlock.AddStatement(new IfElseStatement(ExpressionBuilder.Identifier(helperMethodName).Call(ExpressionBuilder.Identifier(initFieldName)), ifTrueBlock)); ifTrueBlock.Assign(ExpressionBuilder.Identifier(variableName), initializer); BlockStatement finallyBlock = new BlockStatement(); finallyBlock.Assign(ExpressionBuilder.Identifier(initFieldName).Member("State"), new PrimitiveExpression(1)); BlockStatement lockBlock = new BlockStatement(); lockBlock.AddStatement(new TryCatchStatement(tryBlock, null, finallyBlock)); return(new LockStatement(ExpressionBuilder.Identifier(initFieldName), lockBlock)); }