44using System . Collections . Generic ;
55using System . IO ;
66
7+ using ICSharpCode . Decompiler ;
8+ using ICSharpCode . Decompiler . CSharp ;
9+ using ICSharpCode . Decompiler . TypeSystem ;
10+ using ICSharpCode . Decompiler . CSharp . Syntax ;
11+
712namespace Generater
813{
914 public class ClassGenerater : CodeGenerater
@@ -12,14 +17,22 @@ public class ClassGenerater : CodeGenerater
1217
1318 List < PropertyGenerater > properties = new List < PropertyGenerater > ( ) ;
1419 List < MethodGenerater > methods = new List < MethodGenerater > ( ) ;
15-
20+ List < TypeDefinition > nestType = new List < TypeDefinition > ( ) ;
1621 HashSet < string > refNameSpace = new HashSet < string > ( ) ;
17-
22+ bool hasDefaultConstructor = false ;
1823
1924 public ClassGenerater ( TypeDefinition type )
2025 {
2126 genType = type ;
2227
28+ foreach ( var t in type . NestedTypes )
29+ {
30+ if ( CopyOrign ( t ) )
31+ nestType . Add ( t ) ;
32+ }
33+ if ( CopyOrign ( genType ) )
34+ return ;
35+
2336 foreach ( FieldDefinition field in genType . Fields )
2437 {
2538 properties . Add ( new PropertyGenerater ( field ) ) ;
@@ -37,11 +50,13 @@ public ClassGenerater(TypeDefinition type)
3750
3851 foreach ( MethodDefinition method in genType . Methods )
3952 {
40- if ( method . IsPublic && ! method . IsGetter && ! method . IsSetter && Utils . Filter ( method ) )
53+ if ( ( method . IsPublic || genType . IsInterface ) && ! method . IsGetter && ! method . IsSetter && Utils . Filter ( method ) )
4154 {
4255 methods . Add ( new MethodGenerater ( method ) ) ;
4356 refNameSpace . UnionWith ( Utils . GetNameSpaceRef ( method ) ) ;
4457 }
58+ if ( method . IsConstructor && method . Parameters . Count == 0 && method . IsPublic )
59+ hasDefaultConstructor = true ;
4560 }
4661 }
4762
@@ -52,34 +67,42 @@ public override string TypeFullName()
5267
5368 public override void Gen ( )
5469 {
70+
71+
5572 var filePath = Path . Combine ( Binder . OutDir , $ "Binder.{ TypeFullName ( ) } .cs") ;
5673 using ( new CS ( new CodeWriter ( File . CreateText ( filePath ) ) ) )
5774 {
5875 base . Gen ( ) ;
5976
60-
77+ if ( CopyOrign ( genType ) )
78+ {
79+ CS . Writer . WriteLine ( CopyGen ( genType , false ) , false ) ;
80+ CS . Writer . EndAll ( ) ;
81+ return ;
82+ }
83+
6184 foreach ( var ns in refNameSpace )
6285 {
6386 if ( ! string . IsNullOrEmpty ( ns ) )
6487 {
6588 CS . Writer . WriteLine ( $ "using { ns } ") ;
66- if ( ! ns . StartsWith ( "System" ) )
67- CS . Writer . WriteLine ( $ "using PS_{ ns } ") ;
89+ // if(!ns.StartsWith("System"))
90+ // CS.Writer.WriteLine($"using PS_{ns}");
6891 }
6992 }
7093 CS . Writer . WriteLine ( "using System.Runtime.InteropServices" ) ;
7194 CS . Writer . WriteLine ( "using Object = UnityEngine.Object" ) ;
7295
7396 if ( ! string . IsNullOrEmpty ( genType . Namespace ) )
7497 {
75- CS . Writer . Start ( $ "namespace PS_ { genType . Namespace } ") ;
98+ CS . Writer . Start ( $ "namespace { genType . Namespace } ") ;
7699 }
77100
78101 var classDefine = $ "public class { genType . Name } ";
79102
80103 if ( genType . IsInterface )
81104 {
82- classDefine += $ " : WObject";
105+ // classDefine += $" : WObject";
83106 }
84107 else if ( genType . BaseType != null )
85108 {
@@ -94,15 +117,24 @@ public override void Gen()
94117
95118 CS . Writer . Start ( classDefine ) ;
96119
120+ foreach ( var t in nestType )
121+ {
122+ CS . Writer . WriteLine ( CopyGen ( t , true ) , false ) ;
123+ }
97124
98- CS . Writer . Start ( $ "internal { genType . Name } (int handle,IntPtr ptr): base(handle, ptr)") ;
99- CS . Writer . End ( ) ;
125+ /* CS.Writer.Start($"internal {genType.Name}(int handle,IntPtr ptr): base(handle, ptr)");
126+ CS.Writer.End();*/
100127
101128 foreach ( var p in properties )
102129 {
103130 p . Gen ( ) ;
104131 }
105132
133+
134+ if ( ! hasDefaultConstructor && ! genType . IsSealed )
135+ {
136+ CS . Writer . WriteLine ( $ "internal { genType . Name } ()" + " { }" , false ) ;
137+ }
106138 foreach ( var m in methods )
107139 {
108140 m . Gen ( ) ;
@@ -111,5 +143,43 @@ public override void Gen()
111143 CS . Writer . EndAll ( ) ;
112144 }
113145 }
146+
147+ bool CopyOrign ( TypeDefinition type )
148+ {
149+ if ( ! type . IsPublic && ! type . IsNestedPublic )
150+ return false ;
151+ return type . IsValueType || type . IsEnum || type . IsDelegate ( ) || type . IsInterface ;
152+ }
153+
154+ string CopyGen ( TypeDefinition type , bool isNested )
155+ {
156+ var tName = type . FullName . Replace ( "/" , "+" ) ;
157+ var name = new FullTypeName ( tName ) ;
158+ SyntaxTree syntaxTree ;
159+
160+ if ( isNested )
161+ {
162+ ITypeDefinition typeInfo = Binder . Decompiler . TypeSystem . MainModule . Compilation . FindType ( name ) . GetDefinition ( ) ;
163+ var tokenOfFirstMethod = typeInfo . MetadataToken ;
164+ syntaxTree = Binder . Decompiler . Decompile ( tokenOfFirstMethod ) ;
165+ }
166+ else
167+ {
168+ syntaxTree = Binder . Decompiler . DecompileType ( name ) ;
169+ }
170+
171+ StringWriter w = new StringWriter ( ) ;
172+ var outVisitor = new CustomOutputVisitor ( isNested , w , Binder . DecompilerSetting . CSharpFormattingOptions ) ;
173+ syntaxTree . AcceptVisitor ( outVisitor ) ;
174+
175+ foreach ( var ns in outVisitor . nestedUsing )
176+ {
177+ CS . Writer . WriteHead ( $ "using { ns } ") ;
178+ }
179+
180+ var txt = w . ToString ( ) ;
181+ return txt ;
182+
183+ }
114184 }
115185}
0 commit comments