public
static
CodeCompileUnit GetDesignerCodeComplieUnit2(CompilationUnitSyntax root)
{
CodeCompileUnit ccu =
new
CodeCompileUnit();
var
firstMember = root.Members[0];
var
namespaceDeclration = (NamespaceDeclarationSyntax)firstMember;
var
designClassDeclaration = (ClassDeclarationSyntax)namespaceDeclration.Members[0];
var
myDesignerClass =
new
CodeTypeDeclaration(designClassDeclaration.Identifier.ToString());
var
initializeComponent =
new
CodeMemberMethod();
var
ns =
new
CodeNamespace(namespaceDeclration.Name.ToString());
foreach
(
var
m in designClassDeclaration.Members)
{
if
(m is ConstructorDeclarationSyntax)
{
var
ctor = ((ConstructorDeclarationSyntax)m);
var
codeBody = ctor.Body.ToString();
codeBody = codeBody.Trim().TrimStart('{').TrimEnd('}').Trim().TrimEnd(';');
CodeSnippetExpression csbody =
new
CodeSnippetExpression(codeBody);
CodeExpressionStatement stmt =
new
CodeExpressionStatement(csbody);
var
cctor =
new
CodeConstructor();
cctor.Name = ctor.Identifier.ToString();
cctor.Statements.Add(stmt);
myDesignerClass.Members.Add(cctor);
}
if
(m is FieldDeclarationSyntax)
{
var
F = ((FieldDeclarationSyntax)m);
var
type = F.Declaration.Type;
foreach
(
var
variable in F.Declaration.Variables)
{
var
field =
new
CodeMemberField();
field.Name = variable.Identifier.ToString();
field.Type =
new
CodeTypeReference(type.ToString());
field.Attributes = GetFieldAttrMapping(F);
myDesignerClass.Members.Add(field);
}
}
if
(m is MethodDeclarationSyntax)
{
var
node = m
as
MethodDeclarationSyntax;
#region xml comments
var
xmlTrivia = node.GetLeadingTrivia()
.Select(i => i.GetStructure())
.OfType<DocumentationCommentTriviaSyntax>()
.FirstOrDefault();
#endregion
var
method = (MethodDeclarationSyntax)m;
var
cmm =
new
CodeMemberMethod();
cmm.Name = method.Identifier.ToString();
string[] comments = xmlTrivia.ToString().Split(
"\r\n"
.ToCharArray());
foreach
(string text in comments)
{
if
(text.Trim() !=
""
)
{
cmm.Comments.Add(
new
CodeCommentStatement(text.Trim().TrimStart(
"///"
.ToCharArray()).Trim(), true));
}
}
if
(cmm.Name ==
"InitializeComponent"
)
{
CodeRegionDirective codeRegion =
new
CodeRegionDirective(CodeRegionMode.Start,
"Windows 窗体设计器生成的代码"
);
CodeRegionDirective codeEndRegion =
new
CodeRegionDirective(CodeRegionMode.
End
,
""
);
cmm.StartDirectives.Add(codeRegion);
cmm.EndDirectives.Add(codeEndRegion);
}
cmm.Attributes = GetMethodAttrMapping(method);
cmm.ReturnType =
new
CodeTypeReference(method.ReturnType.ToString());
foreach
(
var
p in method.ParameterList.Parameters)
{
CodeParameterDeclarationExpression cpd =
new
CodeParameterDeclarationExpression();
cpd.Name = p.Identifier.ToString();
cpd.Type =
new
CodeTypeReference(p.Type.ToString());
cmm.Parameters.Add(cpd);
}
string codeBody = method.Body.ToString();
codeBody = codeBody.Trim().TrimStart('{').TrimEnd('}').Trim().TrimEnd(';');
if
(codeBody !=
""
)
{
CodeSnippetExpression csbody =
new
CodeSnippetExpression(codeBody);
CodeExpressionStatement stmt =
new
CodeExpressionStatement(csbody);
cmm.Statements.Add(stmt);
}
myDesignerClass.Members.Add(cmm);
}
if
(m is MemberDeclarationSyntax)
{
}
}
ccu.Namespaces.Add(ns);
myDesignerClass.IsPartial = true;
ns.Types.Add(myDesignerClass);
return
ccu;
}