public void ValueTypes()
{
// create a namespace
CodeNamespace ns = new CodeNamespace("NS");
ns.Imports.Add(new CodeNamespaceImport("System"));
// create a class
CodeTypeDeclaration class1 = new CodeTypeDeclaration();
class1.Name = "Test";
class1.IsClass = true;
ns.Types.Add(class1);
// create first struct to test nested structs
CodeTypeDeclaration structA = new CodeTypeDeclaration("structA");
structA.IsStruct = true;
CodeTypeDeclaration structB = new CodeTypeDeclaration("structB");
structB.Attributes = MemberAttributes.Public;
structB.IsStruct = true;
CodeMemberField firstInt = new CodeMemberField(typeof(int), "int1");
firstInt.Attributes = MemberAttributes.Public;
structB.Members.Add(firstInt);
CodeMemberField innerStruct = new CodeMemberField("structB", "innerStruct");
innerStruct.Attributes = MemberAttributes.Public;
structA.Members.Add(structB);
structA.Members.Add(innerStruct);
class1.Members.Add(structA);
// create second struct to test tructs of non-primative types
CodeTypeDeclaration structC = new CodeTypeDeclaration("structC");
structC.IsStruct = true;
CodeMemberField firstPt = new CodeMemberField("Point", "pt1");
firstPt.Attributes = MemberAttributes.Public;
structC.Members.Add(firstPt);
CodeMemberField secondPt = new CodeMemberField("Point", "pt2");
secondPt.Attributes = MemberAttributes.Public;
structC.Members.Add(secondPt);
class1.Members.Add(structC);
// create method to test nested struct
CodeMemberMethod nestedStructMethod = new CodeMemberMethod();
nestedStructMethod.Name = "NestedStructMethod";
nestedStructMethod.ReturnType = new CodeTypeReference(typeof(int));
nestedStructMethod.Attributes = MemberAttributes.Public | MemberAttributes.Static;
CodeVariableDeclarationStatement varStructA = new CodeVariableDeclarationStatement("structA", "varStructA");
nestedStructMethod.Statements.Add(varStructA);
nestedStructMethod.Statements.Add
(
new CodeAssignStatement
(
/* Expression1 */ new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("varStructA"), "innerStruct"), "int1"),
/* Expression1 */ new CodePrimitiveExpression(3)
)
);
nestedStructMethod.Statements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("varStructA"), "innerStruct"), "int1")));
class1.Members.Add(nestedStructMethod);
// create method to test nested non primative struct member
CodeMemberMethod nonPrimativeStructMethod = new CodeMemberMethod();
nonPrimativeStructMethod.Name = "NonPrimativeStructMethod";
nonPrimativeStructMethod.ReturnType = new CodeTypeReference(typeof(DateTime));
nonPrimativeStructMethod.Attributes = MemberAttributes.Public | MemberAttributes.Static;
CodeVariableDeclarationStatement varStructC = new CodeVariableDeclarationStatement("structC", "varStructC");
nonPrimativeStructMethod.Statements.Add(varStructC);
nonPrimativeStructMethod.Statements.Add
(
new CodeAssignStatement
(
/* Expression1 */ new CodeFieldReferenceExpression(
new CodeVariableReferenceExpression("varStructC"),
"pt1"),
/* Expression2 */ new CodeObjectCreateExpression("DateTime", new CodeExpression[] { new CodePrimitiveExpression(1), new CodePrimitiveExpression(-1) })
)
);
nonPrimativeStructMethod.Statements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("varStructC"), "pt1")));
class1.Members.Add(nonPrimativeStructMethod);
AssertEqual(ns,
@"namespace NS {
using System;
public class Test {
public static int NestedStructMethod() {
structA varStructA;
varStructA.innerStruct.int1 = 3;
return varStructA.innerStruct.int1;
}
public static System.DateTime NonPrimativeStructMethod() {
structC varStructC;
varStructC.pt1 = new DateTime(1, -1);
return varStructC.pt1;
}
public struct structA {
public structB innerStruct;
public struct structB {
public int int1;
}
}
public struct structC {
public Point pt1;
public Point pt2;
}
}
}");
}