@@ -62,6 +62,7 @@ internal class NameService : INameService {
6262 readonly byte [ ] nameId = new byte [ 8 ] ;
6363 readonly Dictionary < string , string > _originalToObfuscatedNameMap = new Dictionary < string , string > ( ) ;
6464 readonly Dictionary < string , string > _obfuscatedToOriginalNameMap = new Dictionary < string , string > ( ) ;
65+ readonly Dictionary < string , string > _prefixesMap = new Dictionary < string , string > ( ) ;
6566 internal ReversibleRenamer reversibleRenamer ;
6667
6768 public NameService ( ConfuserContext context ) {
@@ -140,7 +141,7 @@ public void ReduceRenameMode(object obj, RenameMode val) {
140141 if ( original < val )
141142 context . Annotations . Set ( obj , RenameModeKey , val ) ;
142143 if ( val <= RenameMode . Reflection && obj is IDnlibDef dnlibDef ) {
143- string nameWithoutParams = GetSimplifiedFullName ( dnlibDef , true ) ;
144+ string nameWithoutParams = ExtractActualName ( dnlibDef , true ) ;
144145 SetOriginalName ( dnlibDef , nameWithoutParams ) ;
145146 }
146147 }
@@ -282,7 +283,7 @@ public void SetOriginalName(IDnlibDef dnlibDef, string newFullName = null) {
282283 if ( dnlibDef is TypeDef typeDef ) {
283284 AddReservedIdentifier ( typeDef . Namespace ) ;
284285 }
285- string fullName = newFullName ?? GetSimplifiedFullName ( dnlibDef ) ;
286+ string fullName = newFullName ?? ExtractActualName ( dnlibDef ) ;
286287 context . Annotations . Set ( dnlibDef , OriginalFullNameKey , fullName ) ;
287288 }
288289
@@ -361,50 +362,71 @@ public IList<INameReference> GetReferences(object obj) {
361362 }
362363
363364 public string GetOriginalFullName ( IDnlibDef obj ) =>
364- context . Annotations . Get ( obj , OriginalFullNameKey , ( string ) null ) ?? GetSimplifiedFullName ( obj ) ;
365+ context . Annotations . Get ( obj , OriginalFullNameKey , ( string ) null ) ?? ExtractActualName ( obj ) ;
365366
366367 public IReadOnlyDictionary < string , string > GetNameMap ( ) => _obfuscatedToOriginalNameMap ;
367368
368369 public bool IsRenamed ( IDnlibDef def ) => context . Annotations . Get ( def , IsRenamedKey , ! CanRename ( def ) ) ;
369370
370371 public void SetIsRenamed ( IDnlibDef def ) => context . Annotations . Set ( def , IsRenamedKey , true ) ;
371372
372- string GetSimplifiedFullName ( IDnlibDef dnlibDef , bool forceShortNames = false ) {
373- string result ;
374-
373+ string ExtractActualName ( IDnlibDef dnlibDef , bool forceShortNames = false ) {
375374 var shortNames = forceShortNames ||
376375 GetParam ( dnlibDef , "shortNames" ) ? . Equals ( "true" , StringComparison . OrdinalIgnoreCase ) ==
377376 true ;
377+ var renameMode = GetRenameMode ( dnlibDef ) ;
378+
379+ if ( dnlibDef is TypeDef typeDef ) {
380+ return typeDef . DeclaringType != null
381+ ? $ "{ CompressTypeName ( typeDef . DeclaringType . FullName , renameMode ) } /{ dnlibDef . Name } "
382+ : dnlibDef . FullName ;
383+ }
384+
378385 if ( shortNames ) {
379- result = dnlibDef is MethodDef ? ( string ) dnlibDef . Name : dnlibDef . FullName ;
386+ return dnlibDef . Name ;
380387 }
381- else {
382- if ( dnlibDef is MethodDef methodDef ) {
383- var resultBuilder = new StringBuilder ( ) ;
384- resultBuilder . Append ( methodDef . DeclaringType2 ? . FullName ) ;
385- resultBuilder . Append ( "::" ) ;
386- resultBuilder . Append ( dnlibDef . Name ) ;
387388
389+ var resultBuilder = new StringBuilder ( ) ;
390+ if ( dnlibDef is IMemberDef memberDef ) {
391+ var declaringTypeName = CompressTypeName ( memberDef . DeclaringType ? . FullName ?? "" , renameMode ) ;
392+ resultBuilder . Append ( declaringTypeName ) ;
393+ resultBuilder . Append ( "::" ) ;
394+ resultBuilder . Append ( dnlibDef . Name ) ;
395+
396+ if ( memberDef is MethodDef methodDef ) {
388397 resultBuilder . Append ( '(' ) ;
389398 if ( methodDef . Signature is MethodSig methodSig ) {
390399 var methodParams = methodSig . Params ;
391400 for ( var index = 0 ; index < methodParams . Count ; index ++ ) {
392- resultBuilder . Append ( methodParams [ index ] ) ;
401+ resultBuilder . Append ( CompressTypeName ( methodParams [ index ] . ToString ( ) , renameMode ) ) ;
393402 if ( index < methodParams . Count - 1 ) {
394403 resultBuilder . Append ( ',' ) ;
395404 }
396405 }
397406 }
398- resultBuilder . Append ( ')' ) ;
399407
400- result = resultBuilder . ToString ( ) ;
408+ resultBuilder . Append ( ')' ) ;
401409 }
402- else {
403- result = dnlibDef . FullName ;
410+ }
411+
412+ return resultBuilder . ToString ( ) ;
413+ }
414+
415+ string CompressTypeName ( string typeName , RenameMode renameMode )
416+ {
417+ if ( renameMode == RenameMode . Reversible )
418+ {
419+ if ( ! _prefixesMap . TryGetValue ( typeName , out string prefix ) )
420+ {
421+ IncrementNameId ( ) ;
422+ prefix = Utils . EncodeString ( nameId , alphaNumCharset ) ;
423+ _prefixesMap . Add ( typeName , prefix ) ;
404424 }
425+
426+ return prefix ;
405427 }
406428
407- return result ;
429+ return typeName ;
408430 }
409431 }
410432}
0 commit comments