@@ -25,11 +25,14 @@ public class ClassGenerater : CodeGenerater
2525
2626 public HashSet < string > RefNameSpace = new HashSet < string > ( ) ;
2727
28+ Dictionary < int , AstNode > retainDic = new Dictionary < int , AstNode > ( ) ;
2829 public ClassGenerater ( TypeDefinition type , StreamWriter writer = null )
2930 {
31+
3032 genType = type ;
3133 RefNameSpace . Add ( "PureScript.Mono" ) ;
3234
35+ CheckCopyOrignNodes ( ) ;
3336 if ( writer == null )
3437 {
3538 var filePath = Path . Combine ( Binder . OutDir , $ "Binder.{ TypeFullName ( ) } .cs") ;
@@ -83,7 +86,7 @@ public ClassGenerater(TypeDefinition type, StreamWriter writer = null)
8386
8487 foreach ( PropertyDefinition prop in genType . Properties )
8588 {
86- if ( Utils . Filter ( prop ) )
89+ if ( Utils . Filter ( prop ) && ! IsCopyOrignNode ( prop ) )
8790 {
8891 var pt = prop . PropertyType . Resolve ( ) ;
8992 if ( pt . IsDelegate ( ) )
@@ -102,8 +105,9 @@ public ClassGenerater(TypeDefinition type, StreamWriter writer = null)
102105 {
103106 foreach ( MethodDefinition method in genType . Methods )
104107 {
105- // if (isFullValueType && (method.Name.StartsWith("op_") || method.Name == "Equals"))
106- // continue;
108+ if ( IsCopyOrignNode ( method ) )
109+ continue ;
110+
107111 if ( ( method . IsPublic || genType . IsInterface ) && ! method . IsGetter && ! method . IsSetter && ! method . IsAddOn && ! method . IsRemoveOn && Utils . Filter ( method ) )
108112 {
109113 methods . Add ( new MethodGenerater ( method ) ) ;
@@ -139,9 +143,9 @@ public override void Gen()
139143 {
140144 base . Gen ( ) ;
141145
142- if ( IsCopyOrign ( genType ) )
146+ if ( IsCopyOrignType ( genType ) )
143147 {
144- CopyGen ( genType ) ;
148+ CopyType ( genType ) ;
145149 CS . Writer . EndAll ( ) ;
146150 return ;
147151 }
@@ -210,27 +214,27 @@ public override void Gen()
210214 {
211215 m . Gen ( ) ;
212216 }
217+
218+ GenCopyOrignNodes ( ) ;
213219
214220 CS . Writer . EndAll ( ) ;
215221 }
216222 }
217223
218- bool IsCopyOrign ( TypeDefinition type )
224+ bool IsCopyOrignType ( TypeDefinition type )
219225 {
220226 if ( type . IsGeneric ( ) && ! type . IsDelegate ( ) )
221227 return false ;
222228 return type . IsValueType || type . IsEnum || type . IsDelegate ( ) || type . IsInterface ;
223229 }
224230
225- void CopyGen ( TypeDefinition type )
231+ void CopyType ( TypeDefinition type )
226232 {
227-
228233 bool isNested = type . IsNested ;
229234
230-
231235 HashSet < string > IgnoreNestType = new HashSet < string > ( ) ;
232236
233- if ( ! ( isNested && IsCopyOrign ( genType . DeclaringType ) ) )
237+ if ( ! ( isNested && IsCopyOrignType ( genType . DeclaringType ) ) )
234238 {
235239 var tName = type . FullName . Replace ( "/" , "+" ) ;
236240 var name = new FullTypeName ( tName ) ;
@@ -299,7 +303,44 @@ void CopyGen(TypeDefinition type )
299303 }
300304
301305 }
306+ }
307+
308+
309+ void CheckCopyOrignNodes ( )
310+ {
311+ if ( genType . Module . Name != "UnityEngine.CoreModule.dll" )
312+ return ;
313+
314+ var retainFilter = new RetainFilter ( genType . MetadataToken . ToInt32 ( ) ) ;
315+ var tName = genType . FullName . Replace ( "/" , "+" ) ;
316+ var name = new FullTypeName ( tName ) ;
317+ ITypeDefinition typeInfo = Binder . Decompiler . TypeSystem . MainModule . Compilation . FindType ( name ) . GetDefinition ( ) ;
318+ var tokenOfType = typeInfo . MetadataToken ;
319+ var st = Binder . Decompiler . Decompile ( tokenOfType ) ;
320+ st . AcceptVisitor ( retainFilter ) ;
321+ retainDic = retainFilter . RetainDic ;
322+
323+ if ( retainDic . Count > 0 )
324+ RefNameSpace . Add ( "System.Runtime.CompilerServices" ) ;
325+ }
326+ bool IsCopyOrignNode ( MemberReference member )
327+ {
328+ if ( retainDic . Count < 1 )
329+ return false ;
302330
331+ var token = member . MetadataToken . ToInt32 ( ) ;
332+ return token != 0 && retainDic . ContainsKey ( token ) ;
333+ }
334+ void GenCopyOrignNodes ( )
335+ {
336+ if ( retainDic . Count < 1 )
337+ return ;
338+
339+ CS . Writer . WriteLine ( "// -- copy orign code nodes --" ) ;
340+ CS . Writer . Flush ( ) ;
341+ var outputVisitor = new CustomOutputVisitor ( genType . IsNested , CS . Writer . GetWriter ( ) , Binder . DecompilerSetting . CSharpFormattingOptions ) ;
342+ foreach ( var node in retainDic . Values )
343+ node . AcceptVisitor ( outputVisitor ) ;
303344 }
304345 }
305346}
0 commit comments