Skip to content

Commit

Permalink
fix: fix invalid renaming in project level workspace
Browse files Browse the repository at this point in the history
  • Loading branch information
mika-f committed Mar 14, 2024
1 parent be09255 commit 555669e
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ public async Task RenameClasses_Interface()
Assert.Equal(identifier, b.BaseList?.Types[0].Type.ToString());

var c = await reference.GetFirstSyntax<ClassDeclarationSyntax>();
Assert.Equal(identifier, c.ParameterList?.Parameters[1].Type?.ToString());
Assert.Equal(identifier, c.ParameterList?.Parameters[2].Type?.ToString());
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public async Task RenameMethods_ExtensionMethods()
var originalDefinition = await container.GetSourceByPathAsync("Plana.CLI/Extensions/CommandExtensions.cs");
var reference = await container.GetSourceByPathAsync("Plana.CLI/Commands/ObfuscateCommand.cs");

// CommandExtensions.AddOptions -> _0x4e115ed4
const string addOptionsIdentifier = "_0x4e115ed4";
// CommandExtensions.AddOptions -> _0xb35682f5
const string addOptionsIdentifier = "_0xb35682f5";

var def = await originalDefinition.GetFirstSyntax<MethodDeclarationSyntax>((w, sm) =>
{
Expand Down Expand Up @@ -116,8 +116,8 @@ public async Task RenameMethods_GenericsInterfaceMethods()
var @interface = await container.GetSourceByPathAsync("Plana.Testing/ITestableObject.cs");
var implementation = await container.GetSourceByTypeAsync(typeof(InlineSource));

// ITestableObject<T>.ToMatchInlineSnapshot(T) -> _0x204ecb6f
const string identifier = "_0x204ecb6f";
// ITestableObject<T>.ToMatchInlineSnapshot(T) -> _0x84fd82f3
const string identifier = "_0x84fd82f3";

var decl = await @interface.GetFirstSyntax<MethodDeclarationSyntax>();
Assert.Equal(identifier, decl.Identifier.ToString());
Expand All @@ -134,8 +134,8 @@ public async Task RenameMethods_GenericsMethods()

var implementation = await container.GetSourceByTypeAsync(typeof(InlineSource));

// InlineSource.GetSyntaxOf<T> -> _0x2b70476f
const string identifier = "_0x2b70476f";
// InlineSource.GetSyntaxOf<T> -> _0xd52be804
const string identifier = "_0xd52be804";

var def = await implementation.GetFirstSyntax<MethodDeclarationSyntax>((w, sm) =>
{
Expand Down Expand Up @@ -234,8 +234,8 @@ bool IsMethodsHasRunAsyncSignature(MethodDeclarationSyntax w, SemanticModel sm)
});
Assert.Equal(runAsyncIdentifier, ((MemberAccessExpressionSyntax)referenceDecl.Expression).Name.Identifier.ToString());

// IPlanaPlugin2.ObfuscateAsync -> _0xba881b8e
const string obfuscateAsyncIdentifier = "_0xba881b8e";
// IPlanaPlugin2.ObfuscateAsync -> _0xc7b29ba1
const string obfuscateAsyncIdentifier = "_0xc7b29ba1";

var inheritAbstractionDecl2 = (await inheritAbstraction.GetSyntaxList<MethodDeclarationSyntax>(IsMethodsHasRunAsyncSignature))[1];
Assert.Equal(obfuscateAsyncIdentifier, inheritAbstractionDecl2.Identifier.ToString());
Expand All @@ -253,8 +253,8 @@ public async Task RenameMethods_OriginalDefinitionMethods()
var originalDefinition = await container.GetSourceByPathAsync("Plana.Workspace/SolutionWorkspace.cs");
var reference = await container.GetSourceByPathAsync("Plana.CLI/Commands/ObfuscateCommand.cs");

// SolutionWorkspace.CreateWorkspaceAsync -> _0xc686c7a5
const string createWorkspaceAsyncIdentifier = "_0xc686c7a5";
// SolutionWorkspace.CreateWorkspaceAsync -> _0xc09f4e99
const string createWorkspaceAsyncIdentifier = "_0xc09f4e99";

var def = await originalDefinition.GetFirstSyntax<MethodDeclarationSyntax>(w => w.HasModifier(SyntaxKind.StaticKeyword));
Assert.Equal(createWorkspaceAsyncIdentifier, def.Identifier.ToString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public async Task RenameVariables_ForEachStatement()

var implementation = await container.GetSourceByTypeAsync(typeof(Obfuscator));

// instance -> _0x3a050ac8
const string identifier = "_0x3a050ac8";
// instance -> _0xc22a5edb
const string identifier = "_0xc22a5edb";

var @foreach = await implementation.GetFirstSyntax<ForEachStatementSyntax>();
Assert.Equal(identifier, @foreach.Identifier.ToFullString());
Expand All @@ -38,8 +38,8 @@ public async Task RenameVariables_PrimaryConstructor()

var implementation = await container.GetSourceByTypeAsync(typeof(AnnotationComment));

// AnnotationComment.Annotation -> _0xd660581b
const string identifier = "_0xd660581b";
// AnnotationComment.Annotation -> _0xf35395eb
const string identifier = "_0xf35395eb";

var declaration = await implementation.GetFirstSyntax<RecordDeclarationSyntax>();
var constructor = declaration.ParameterList!.Parameters[0];
Expand Down
33 changes: 22 additions & 11 deletions src/Plana.Composition.RenameSymbols/CSharpSymbolsWalker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

namespace Plana.Composition.RenameSymbols;

internal class CSharpSymbolsWalker(IDocument document, IPlanaSecureRandom random, bool isRenameNamespaces, bool isRenameClasses, bool isRenameProperties, bool isRenameFields, bool isRenameMethods, bool isRenameVariables, Dictionary<ISymbol, string> dict)
internal class CSharpSymbolsWalker(ISolution solution, IDocument document, IPlanaSecureRandom random, bool isRenameNamespaces, bool isRenameClasses, bool isRenameProperties, bool isRenameFields, bool isRenameMethods, bool isRenameVariables, Dictionary<ISymbol, string> dict)
: CSharpSyntaxWalker
{
private static readonly List<string> Messages =
Expand Down Expand Up @@ -167,6 +167,12 @@ public override void VisitForEachStatement(ForEachStatementSyntax node)
base.VisitForEachStatement(node);
}

private string KeepOriginalName(ISymbol symbol, string? name = null)
{
dict.Add(symbol, name ?? symbol.Name);
return name ?? symbol.Name;
}

#region classes

public override void VisitClassDeclaration(ClassDeclarationSyntax node)
Expand Down Expand Up @@ -271,19 +277,17 @@ private string SetMethodIdentifier(IMethodSymbol symbol)
var overridden = original.OverriddenMethod;
var isExternalDefinition = overridden.Locations.Any(w => w.IsInMetadata);
if (isExternalDefinition)
{
// keep
dict.Add(symbol, overridden.Name);
return overridden.Name;
}
return KeepOriginalName(symbol, overridden.Name);

if (overridden.IsNotInWorkspace(solution))
return KeepOriginalName(symbol, overridden.Name);
}

if (original.Locations.Any(w => w.IsInMetadata))
{
// keep
dict.Add(symbol, symbol.Name);
return symbol.Name;
}
return KeepOriginalName(symbol);

if (original.IsNotInWorkspace(solution))
return KeepOriginalName(symbol);

var @interface = symbol.GetInterfaceSymbol();
if (@interface is IMethodSymbol s)
Expand Down Expand Up @@ -339,6 +343,10 @@ private string SetPropertyIdentifier(IPropertySymbol symbol)
return val;

var original = symbol.OriginalDefinition;

if (original.IsNotInWorkspace(solution))
return KeepOriginalName(original);

var @interface = symbol.GetInterfaceSymbol();
if (@interface is IPropertySymbol s)
{
Expand Down Expand Up @@ -395,6 +403,9 @@ private void SetNamespaceIdentifier(INamespaceSymbol symbol)
if (dict.ContainsKey(symbol))
return;

if (symbol.IsNotInWorkspace(solution))
return;

if (symbol.ContainingNamespace.IsGlobalNamespace)
{
// root namespace
Expand Down
1 change: 1 addition & 0 deletions src/Plana.Composition.RenameSymbols/RenameSymbolsPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public async Task ObfuscateAsync(IPlanaPluginRunContext context)
foreach (var document in context.Solution.Projects.SelectMany(w => w.Documents))
{
var walker = new CSharpSymbolsWalker(
context.Solution,
document,
context.SecureRandom,
IsEnableNamespaceRenaming,
Expand Down

0 comments on commit 555669e

Please sign in to comment.