From e81454db7e9f81e379048191fa3e281c01c9650e Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Sun, 15 Aug 2021 17:26:46 +0300 Subject: [PATCH 1/2] Add BlockingReferences test that reveals #379 --- Confuser2.sln | 45 +++++++++++++++++++ .../BlockingReferences.Test.csproj | 11 +++++ Tests/BlockingReferences.Test/Program.cs | 26 +++++++++++ .../BlockingReferences.csproj | 12 +++++ Tests/BlockingReferences/Program.cs | 26 +++++++++++ .../BaseImplementation.cs | 5 +++ .../BlockingReferencesHelper.csproj | 7 +++ 7 files changed, 132 insertions(+) create mode 100644 Tests/BlockingReferences.Test/BlockingReferences.Test.csproj create mode 100644 Tests/BlockingReferences.Test/Program.cs create mode 100644 Tests/BlockingReferences/BlockingReferences.csproj create mode 100644 Tests/BlockingReferences/Program.cs create mode 100644 Tests/BlockingReferencesHelper/BaseImplementation.cs create mode 100644 Tests/BlockingReferencesHelper/BlockingReferencesHelper.csproj diff --git a/Confuser2.sln b/Confuser2.sln index 1ca772db..0d898433 100644 --- a/Confuser2.sln +++ b/Confuser2.sln @@ -137,6 +137,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "389_MixedCultureCasing", "T EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "389_MixedCultureCasing.Test", "Tests\389_MixedCultureCasing.Test\389_MixedCultureCasing.Test.csproj", "{D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlockingReferences", "Tests\BlockingReferences\BlockingReferences.csproj", "{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlockingReferencesHelper", "Tests\BlockingReferencesHelper\BlockingReferencesHelper.csproj", "{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlockingReferences.Test", "Tests\BlockingReferences.Test\BlockingReferences.Test.csproj", "{4FB03AD0-96FF-4730-801A-4F997795D920}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -866,6 +872,42 @@ Global {D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}.Release|x64.Build.0 = Release|Any CPU {D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}.Release|x86.ActiveCfg = Release|Any CPU {D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}.Release|x86.Build.0 = Release|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x64.ActiveCfg = Debug|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x64.Build.0 = Debug|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x86.ActiveCfg = Debug|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x86.Build.0 = Debug|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|Any CPU.Build.0 = Release|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x64.ActiveCfg = Release|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x64.Build.0 = Release|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x86.ActiveCfg = Release|Any CPU + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x86.Build.0 = Release|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x64.ActiveCfg = Debug|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x64.Build.0 = Debug|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x86.ActiveCfg = Debug|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x86.Build.0 = Debug|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|Any CPU.Build.0 = Release|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x64.ActiveCfg = Release|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x64.Build.0 = Release|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x86.ActiveCfg = Release|Any CPU + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x86.Build.0 = Release|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x64.ActiveCfg = Debug|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x64.Build.0 = Debug|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x86.ActiveCfg = Debug|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x86.Build.0 = Debug|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Release|Any CPU.Build.0 = Release|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x64.ActiveCfg = Release|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x64.Build.0 = Release|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x86.ActiveCfg = Release|Any CPU + {4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -923,6 +965,9 @@ Global {5E9715AB-CAF7-4FFF-8E14-A8727891DA93} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB} {75E5F9A0-8D69-4426-9F16-4A65E941974D} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB} {D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB} + {F602DAFE-E8A2-4CB2-AF0E-656CD357D821} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB} + {9EB8DC3B-60DC-451E-8C18-3D7E38D463FD} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB} + {4FB03AD0-96FF-4730-801A-4F997795D920} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {0D937D9E-E04B-4A68-B639-D4260473A388} diff --git a/Tests/BlockingReferences.Test/BlockingReferences.Test.csproj b/Tests/BlockingReferences.Test/BlockingReferences.Test.csproj new file mode 100644 index 00000000..f38282b5 --- /dev/null +++ b/Tests/BlockingReferences.Test/BlockingReferences.Test.csproj @@ -0,0 +1,11 @@ + + + + net461 + + + + + + + diff --git a/Tests/BlockingReferences.Test/Program.cs b/Tests/BlockingReferences.Test/Program.cs new file mode 100644 index 00000000..cfa2a14c --- /dev/null +++ b/Tests/BlockingReferences.Test/Program.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Confuser.Core; +using Confuser.Core.Project; +using Confuser.UnitTest; +using Xunit; +using Xunit.Abstractions; + +namespace BlockingReferences.Test { + public class BlockingReferencesTest : TestBase { + public BlockingReferencesTest(ITestOutputHelper outputHelper) : base(outputHelper) { } + + [Fact] + [Trait("Category", "Protection")] + [Trait("Protection", "rename")] + [Trait("Issue", "https://github.com/mkaring/ConfuserEx/issues/379")] + public async Task BlockingReferences() => + await Run( + new [] { "BlockingReferences.exe", "BlockingReferencesHelper.dll" }, + new [] { + "", + "Implementation2", + }, + new SettingItem("rename") { ["renPublic"] = "true", ["mode"] = "decodable" } + ); + } +} diff --git a/Tests/BlockingReferences/BlockingReferences.csproj b/Tests/BlockingReferences/BlockingReferences.csproj new file mode 100644 index 00000000..af79c190 --- /dev/null +++ b/Tests/BlockingReferences/BlockingReferences.csproj @@ -0,0 +1,12 @@ + + + + Exe + net461 + + + + + + + diff --git a/Tests/BlockingReferences/Program.cs b/Tests/BlockingReferences/Program.cs new file mode 100644 index 00000000..51585929 --- /dev/null +++ b/Tests/BlockingReferences/Program.cs @@ -0,0 +1,26 @@ +using System; +using BlockingReferencesHelper; + +namespace BlockingReferences { + public interface IBaseInterface { + string Method(); + } + + public class Implementation1 : BaseImplementation, IBaseInterface { + } + + public class Implementation2 : BaseImplementation, IBaseInterface { + public override string Method() => "Implementation2"; + } + + public static class Program { + public static int Main() { + Console.WriteLine("START"); + Console.WriteLine(new Implementation1().Method()); + Console.WriteLine(new Implementation2().Method()); + Console.WriteLine("END"); + + return 42; + } + } +} diff --git a/Tests/BlockingReferencesHelper/BaseImplementation.cs b/Tests/BlockingReferencesHelper/BaseImplementation.cs new file mode 100644 index 00000000..d45d35ba --- /dev/null +++ b/Tests/BlockingReferencesHelper/BaseImplementation.cs @@ -0,0 +1,5 @@ +namespace BlockingReferencesHelper { + public class BaseImplementation { + public virtual T Method() => default; + } +} diff --git a/Tests/BlockingReferencesHelper/BlockingReferencesHelper.csproj b/Tests/BlockingReferencesHelper/BlockingReferencesHelper.csproj new file mode 100644 index 00000000..1827b043 --- /dev/null +++ b/Tests/BlockingReferencesHelper/BlockingReferencesHelper.csproj @@ -0,0 +1,7 @@ + + + + net461 + + + From 689b87df78bb74cdfe89354b1c4982ddcb671574 Mon Sep 17 00:00:00 2001 From: Martin Karing Date: Sat, 16 Oct 2021 22:20:31 +0200 Subject: [PATCH 2/2] Fixed detection of blocking references across multiple assemblies --- Confuser.Renamer/Analyzers/VTableAnalyzer.cs | 5 ++++- Confuser.Renamer/INameReference.cs | 3 ++- .../References/BAMLAttributeReference.cs | 2 +- .../BAMLConverterMemberReference.cs | 2 +- .../References/BAMLConverterTypeReference.cs | 2 +- .../References/BAMLEnumReference.cs | 2 +- .../References/BAMLPathTypeReference.cs | 2 +- .../References/BAMLTypeReference.cs | 2 +- .../References/CAMemberReference.cs | 2 +- .../MemberOldestSiblingReference.cs | 2 +- .../References/MemberOverrideReference.cs | 7 ++++-- .../References/MemberRefReference.cs | 2 +- .../References/MemberSiblingReference.cs | 7 ++++-- .../References/OverrideDirectiveReference.cs | 2 +- .../References/RequiredPrefixReference.cs | 2 +- .../References/ResourceReference.cs | 2 +- .../References/StringMemberNameReference.cs | 2 +- .../References/StringTypeReference.cs | 2 +- .../References/TypeRefReference.cs | 2 +- Confuser.Renamer/RenamePhase.cs | 2 +- Tests/BlockingReferences.Test/Program.cs | 22 ++++++++++++++++--- 21 files changed, 51 insertions(+), 25 deletions(-) diff --git a/Confuser.Renamer/Analyzers/VTableAnalyzer.cs b/Confuser.Renamer/Analyzers/VTableAnalyzer.cs index 87158a00..f3b2a8fb 100644 --- a/Confuser.Renamer/Analyzers/VTableAnalyzer.cs +++ b/Confuser.Renamer/Analyzers/VTableAnalyzer.cs @@ -150,7 +150,9 @@ static void CreateSiblingReference(T basePropDef, ref T discoveredBaseMemberD // Check if the discovered base type is the current type. If so, nothing needs to be done. if (ReferenceEquals(basePropDef, discoveredBaseMemberDef)) return; - service.AddReference(basePropDef, new MemberSiblingReference(basePropDef, discoveredBaseMemberDef)); + var reference = new MemberSiblingReference(basePropDef, discoveredBaseMemberDef); + service.AddReference(basePropDef, reference); + service.AddReference(discoveredBaseMemberDef, reference); UpdateOldestSiblingReference(discoveredBaseMemberDef, basePropDef, service); } } @@ -188,6 +190,7 @@ static void RedirectSiblingReferences(IMemberDef oldMemberDef, IMemberDef newMem static void CreateOverrideReference(INameService service, IMemberDef thisMemberDef, IMemberDef baseMemberDef) { var overrideRef = new MemberOverrideReference(thisMemberDef, baseMemberDef); service.AddReference(thisMemberDef, overrideRef); + service.AddReference(baseMemberDef, overrideRef); PropagateRenamingRestrictions(service, thisMemberDef, baseMemberDef); } diff --git a/Confuser.Renamer/INameReference.cs b/Confuser.Renamer/INameReference.cs index 53b8f06f..3e1b953a 100644 --- a/Confuser.Renamer/INameReference.cs +++ b/Confuser.Renamer/INameReference.cs @@ -1,4 +1,5 @@ using Confuser.Core; +using dnlib.DotNet; namespace Confuser.Renamer { public interface INameReference { @@ -15,7 +16,7 @@ public interface INameReference { /// /// in case the reference can't be resolved yet; /// otherwise . - bool DelayRenaming(INameService service); + bool DelayRenaming(INameService service, IDnlibDef currentDef); /// /// Update the name reference. diff --git a/Confuser.Renamer/References/BAMLAttributeReference.cs b/Confuser.Renamer/References/BAMLAttributeReference.cs index 91392bd9..e1f14e4f 100644 --- a/Confuser.Renamer/References/BAMLAttributeReference.cs +++ b/Confuser.Renamer/References/BAMLAttributeReference.cs @@ -22,7 +22,7 @@ public BAMLAttributeReference(IDnlibDef member, PropertyRecord rec) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { if (attrRec != null) { diff --git a/Confuser.Renamer/References/BAMLConverterMemberReference.cs b/Confuser.Renamer/References/BAMLConverterMemberReference.cs index 805f9667..c8c7852f 100644 --- a/Confuser.Renamer/References/BAMLConverterMemberReference.cs +++ b/Confuser.Renamer/References/BAMLConverterMemberReference.cs @@ -21,7 +21,7 @@ public BAMLConverterMemberReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { string typeName = sig.ReflectionName; diff --git a/Confuser.Renamer/References/BAMLConverterTypeReference.cs b/Confuser.Renamer/References/BAMLConverterTypeReference.cs index ac405449..9448b123 100644 --- a/Confuser.Renamer/References/BAMLConverterTypeReference.cs +++ b/Confuser.Renamer/References/BAMLConverterTypeReference.cs @@ -26,7 +26,7 @@ public BAMLConverterTypeReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig si } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { string name = sig.ReflectionName; diff --git a/Confuser.Renamer/References/BAMLEnumReference.cs b/Confuser.Renamer/References/BAMLEnumReference.cs index f92589c5..d41bd87d 100644 --- a/Confuser.Renamer/References/BAMLEnumReference.cs +++ b/Confuser.Renamer/References/BAMLEnumReference.cs @@ -16,7 +16,7 @@ public BAMLEnumReference(FieldDef enumField, PropertyRecord rec) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { if (UTF8String.Equals(rec.Value, enumField.Name)) return false; diff --git a/Confuser.Renamer/References/BAMLPathTypeReference.cs b/Confuser.Renamer/References/BAMLPathTypeReference.cs index df85c4fa..042dc60a 100644 --- a/Confuser.Renamer/References/BAMLPathTypeReference.cs +++ b/Confuser.Renamer/References/BAMLPathTypeReference.cs @@ -22,7 +22,7 @@ private BAMLPathTypeReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig sig) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public BAMLPathTypeReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig sig, PropertyPathIndexUpdater indexerInfo) : this(xmlnsCtx, sig) => IndexerInfo = indexerInfo; diff --git a/Confuser.Renamer/References/BAMLTypeReference.cs b/Confuser.Renamer/References/BAMLTypeReference.cs index 1e010b8a..6f6f69c6 100644 --- a/Confuser.Renamer/References/BAMLTypeReference.cs +++ b/Confuser.Renamer/References/BAMLTypeReference.cs @@ -23,7 +23,7 @@ public bool UpdateNameReference(ConfuserContext context, INameService service) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public override string ToString() => ToString(null); diff --git a/Confuser.Renamer/References/CAMemberReference.cs b/Confuser.Renamer/References/CAMemberReference.cs index 9bd31978..4c49dca6 100644 --- a/Confuser.Renamer/References/CAMemberReference.cs +++ b/Confuser.Renamer/References/CAMemberReference.cs @@ -15,7 +15,7 @@ public CAMemberReference(CANamedArgument namedArg, IDnlibDef definition) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { if (UTF8String.Equals(namedArg.Name, definition.Name)) return false; diff --git a/Confuser.Renamer/References/MemberOldestSiblingReference.cs b/Confuser.Renamer/References/MemberOldestSiblingReference.cs index 5827bcaa..3bc543c6 100644 --- a/Confuser.Renamer/References/MemberOldestSiblingReference.cs +++ b/Confuser.Renamer/References/MemberOldestSiblingReference.cs @@ -25,7 +25,7 @@ public MemberOldestSiblingReference(IMemberDef oldestSiblingDef, IMemberDef othe public bool ShouldCancelRename => false; /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; /// public bool UpdateNameReference(ConfuserContext context, INameService service) => false; diff --git a/Confuser.Renamer/References/MemberOverrideReference.cs b/Confuser.Renamer/References/MemberOverrideReference.cs index 71d3c19e..d9add4bd 100644 --- a/Confuser.Renamer/References/MemberOverrideReference.cs +++ b/Confuser.Renamer/References/MemberOverrideReference.cs @@ -9,7 +9,7 @@ public sealed class MemberOverrideReference : INameReference { readonly IMemberDef thisMemberDef; internal IMemberDef BaseMemberDef { get; } - public bool ShouldCancelRename => false; + public bool ShouldCancelRename => thisMemberDef.Module != BaseMemberDef.Module; public MemberOverrideReference(IMemberDef thisMemberDef, IMemberDef baseMemberDef) { this.thisMemberDef = thisMemberDef ?? throw new ArgumentNullException(nameof(thisMemberDef)); @@ -18,7 +18,10 @@ public MemberOverrideReference(IMemberDef thisMemberDef, IMemberDef baseMemberDe } /// - public bool DelayRenaming(INameService service) => !service.IsRenamed(BaseMemberDef); + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => + currentDef != BaseMemberDef + && !ShouldCancelRename + && !service.IsRenamed(BaseMemberDef); public bool UpdateNameReference(ConfuserContext context, INameService service) { if (UTF8String.Equals(thisMemberDef.Name, BaseMemberDef.Name)) return false; diff --git a/Confuser.Renamer/References/MemberRefReference.cs b/Confuser.Renamer/References/MemberRefReference.cs index 60fb3f04..978129bc 100644 --- a/Confuser.Renamer/References/MemberRefReference.cs +++ b/Confuser.Renamer/References/MemberRefReference.cs @@ -15,7 +15,7 @@ public MemberRefReference(MemberRef memberRef, IMemberDef memberDef) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { if (UTF8String.Equals(memberRef.Name, memberDef.Name)) return false; diff --git a/Confuser.Renamer/References/MemberSiblingReference.cs b/Confuser.Renamer/References/MemberSiblingReference.cs index 18594203..61bedb7e 100644 --- a/Confuser.Renamer/References/MemberSiblingReference.cs +++ b/Confuser.Renamer/References/MemberSiblingReference.cs @@ -24,10 +24,13 @@ public MemberSiblingReference(IMemberDef thisMemberDef, IMemberDef oldestSibling } /// - public bool ShouldCancelRename => false; + public bool ShouldCancelRename => ThisMemberDef.Module != OldestSiblingDef.Module; /// - public bool DelayRenaming(INameService service) => !service.IsRenamed(OldestSiblingDef); + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => + currentDef != OldestSiblingDef + && !ShouldCancelRename + && !service.IsRenamed(OldestSiblingDef); /// public bool UpdateNameReference(ConfuserContext context, INameService service) { diff --git a/Confuser.Renamer/References/OverrideDirectiveReference.cs b/Confuser.Renamer/References/OverrideDirectiveReference.cs index 17d720ae..3873a27d 100644 --- a/Confuser.Renamer/References/OverrideDirectiveReference.cs +++ b/Confuser.Renamer/References/OverrideDirectiveReference.cs @@ -15,7 +15,7 @@ public OverrideDirectiveReference(VTableSlot thisSlot, VTableSlot baseSlot) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) => false; diff --git a/Confuser.Renamer/References/RequiredPrefixReference.cs b/Confuser.Renamer/References/RequiredPrefixReference.cs index 71a76731..028bbc81 100644 --- a/Confuser.Renamer/References/RequiredPrefixReference.cs +++ b/Confuser.Renamer/References/RequiredPrefixReference.cs @@ -18,7 +18,7 @@ internal RequiredPrefixReference(T def, string prefix) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; /// public bool UpdateNameReference(ConfuserContext context, INameService service) { diff --git a/Confuser.Renamer/References/ResourceReference.cs b/Confuser.Renamer/References/ResourceReference.cs index 9c637363..a738167c 100644 --- a/Confuser.Renamer/References/ResourceReference.cs +++ b/Confuser.Renamer/References/ResourceReference.cs @@ -18,7 +18,7 @@ public ResourceReference(Resource resource, TypeDef typeDef, string format) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { var newName = string.Format(CultureInfo.InvariantCulture, format, typeDef.ReflectionFullName); diff --git a/Confuser.Renamer/References/StringMemberNameReference.cs b/Confuser.Renamer/References/StringMemberNameReference.cs index 523d952f..928cc06e 100644 --- a/Confuser.Renamer/References/StringMemberNameReference.cs +++ b/Confuser.Renamer/References/StringMemberNameReference.cs @@ -16,7 +16,7 @@ public StringMemberNameReference(Instruction reference, IMemberDef memberDef) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { switch (_reference.Operand) { diff --git a/Confuser.Renamer/References/StringTypeReference.cs b/Confuser.Renamer/References/StringTypeReference.cs index f4c4c820..280a2c34 100644 --- a/Confuser.Renamer/References/StringTypeReference.cs +++ b/Confuser.Renamer/References/StringTypeReference.cs @@ -16,7 +16,7 @@ public StringTypeReference(Instruction reference, TypeDef typeDef) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { switch (reference.Operand) { diff --git a/Confuser.Renamer/References/TypeRefReference.cs b/Confuser.Renamer/References/TypeRefReference.cs index 4e68e515..ff1c4f87 100644 --- a/Confuser.Renamer/References/TypeRefReference.cs +++ b/Confuser.Renamer/References/TypeRefReference.cs @@ -15,7 +15,7 @@ public TypeRefReference(TypeRef typeRef, TypeDef typeDef) { } /// - public bool DelayRenaming(INameService service) => false; + public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false; public bool UpdateNameReference(ConfuserContext context, INameService service) { if (UTF8String.Equals(typeRef.Namespace, typeDef.Namespace) && diff --git a/Confuser.Renamer/RenamePhase.cs b/Confuser.Renamer/RenamePhase.cs index 588e632c..cb8edd66 100644 --- a/Confuser.Renamer/RenamePhase.cs +++ b/Confuser.Renamer/RenamePhase.cs @@ -120,7 +120,7 @@ static IEnumerable GetTargetsWithDelay(IList definitions, var lastCount = -1; while (currentList.Any()) { foreach (var def in currentList) { - if (service.GetReferences(def).Any(r => r.DelayRenaming(service))) + if (service.GetReferences(def).Any(r => r.DelayRenaming(service, def))) delayedItems.Add(def); else yield return def; diff --git a/Tests/BlockingReferences.Test/Program.cs b/Tests/BlockingReferences.Test/Program.cs index cfa2a14c..fa0a4067 100644 --- a/Tests/BlockingReferences.Test/Program.cs +++ b/Tests/BlockingReferences.Test/Program.cs @@ -14,13 +14,29 @@ public BlockingReferencesTest(ITestOutputHelper outputHelper) : base(outputHelpe [Trait("Protection", "rename")] [Trait("Issue", "https://github.com/mkaring/ConfuserEx/issues/379")] public async Task BlockingReferences() => + await BlockingReferencesInternal("BlockingReferences.exe", "BlockingReferencesHelper.dll"); + + [Fact] + [Trait("Category", "Protection")] + [Trait("Protection", "rename")] + [Trait("Issue", "https://github.com/mkaring/ConfuserEx/issues/379")] + public async Task BlockingReferencesReverse() => + await BlockingReferencesInternal("BlockingReferencesHelper.dll", "BlockingReferences.exe"); + + private async Task BlockingReferencesInternal(params string[] files) => await Run( - new [] { "BlockingReferences.exe", "BlockingReferencesHelper.dll" }, - new [] { + files, + new[] { "", "Implementation2", }, - new SettingItem("rename") { ["renPublic"] = "true", ["mode"] = "decodable" } + new SettingItem("rename") { + ["renPublic"] = "true", + ["mode"] = "decodable" + }, + outputAction: line => { + Assert.DoesNotContain("[WARN] Failed to rename all targeted members", line); + } ); } }