Skip to content

Commit ab7a97b

Browse files
authored
Added parent method name to the interceptor name to avoid name collisions in partial classes (#32)
Added parent method name to the interceptor name to avoid name collisions in partial classes
1 parent 7ce75aa commit ab7a97b

File tree

37 files changed

+261
-184
lines changed

37 files changed

+261
-184
lines changed

src/AutoLoggerMessageGenerator/Extractors/EnclosingClassExtractor.cs

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Microsoft.CodeAnalysis;
2+
using Microsoft.CodeAnalysis.CSharp.Syntax;
3+
4+
namespace AutoLoggerMessageGenerator.Extractors;
5+
6+
internal static class LocationContextExtractor
7+
{
8+
public static LocationContext Extract(InvocationExpressionSyntax invocationExpression)
9+
{
10+
string? className = null, ns = null, methodName = null;
11+
12+
SyntaxNode syntaxNode = invocationExpression;
13+
while (syntaxNode.Parent is not null)
14+
{
15+
if (className is null && syntaxNode is ClassDeclarationSyntax classDeclarationSyntax)
16+
className = classDeclarationSyntax.Identifier.Text;
17+
18+
if (ns is null)
19+
{
20+
if (syntaxNode is NamespaceDeclarationSyntax namespaceDeclarationSyntax)
21+
ns = namespaceDeclarationSyntax.Name.ToString();
22+
23+
if (syntaxNode is FileScopedNamespaceDeclarationSyntax fileScopedNamespaceDeclarationSyntax)
24+
ns = fileScopedNamespaceDeclarationSyntax.Name.ToString();
25+
}
26+
27+
if (methodName is null && syntaxNode is MethodDeclarationSyntax methodDeclarationSyntax)
28+
methodName = methodDeclarationSyntax.Identifier.Text;
29+
30+
syntaxNode = syntaxNode.Parent;
31+
}
32+
33+
return new LocationContext(
34+
ns ?? string.Empty, className ?? string.Empty, methodName ?? string.Empty
35+
);
36+
}
37+
38+
public record LocationContext(string Namespace, string ClassName, string MethodName);
39+
}

src/AutoLoggerMessageGenerator/Extractors/LogCallExtractor.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal static class LogCallExtractor
1212
InvocationExpressionSyntax invocationExpression,
1313
SemanticModel semanticModel)
1414
{
15-
var (ns, className) = EnclosingClassExtractor.Extract(invocationExpression);
15+
var (ns, className, parentMethodName) = LocationContextExtractor.Extract(invocationExpression);
1616

1717
var location = CallLocationMapper.Map(semanticModel, invocationExpression);
1818
if (location is null)
@@ -33,6 +33,16 @@ internal static class LogCallExtractor
3333
if (parameters is null)
3434
return default;
3535

36-
return new LogMessageCall(Guid.NewGuid(), location.Value, ns, className, methodSymbol.Name, logLevel, message, parameters.Value);
36+
return new LogMessageCall(
37+
Guid.NewGuid(),
38+
location.Value,
39+
ns,
40+
className,
41+
parentMethodName,
42+
methodSymbol.Name,
43+
logLevel,
44+
message,
45+
parameters.Value
46+
);
3747
}
3848
}

src/AutoLoggerMessageGenerator/Extractors/LoggerScopeCallExtractor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ internal static class LoggerScopeCallExtractor
1212
InvocationExpressionSyntax invocationExpression,
1313
SemanticModel semanticModel)
1414
{
15-
var (ns, className) = EnclosingClassExtractor.Extract(invocationExpression);
15+
var (ns, className, parentMethodName) = LocationContextExtractor.Extract(invocationExpression);
1616

1717
var location = CallLocationMapper.Map(semanticModel, invocationExpression);
1818
if (location is null)
@@ -29,6 +29,6 @@ internal static class LoggerScopeCallExtractor
2929
if (parameters is null)
3030
return default;
3131

32-
return new LoggerScopeCall(location.Value, ns, className, methodSymbol.Name, message, parameters.Value);
32+
return new LoggerScopeCall(location.Value, ns, className, parentMethodName, methodSymbol.Name, message, parameters.Value);
3333
}
3434
}

src/AutoLoggerMessageGenerator/Models/LogMessageCall.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,29 @@ internal readonly record struct LogMessageCall(
1010
string Namespace,
1111
string ClassName,
1212
string MethodName,
13+
string LogMethodName,
1314
string LogLevel,
1415
string Message,
1516
ImmutableArray<CallParameter> Parameters
1617
)
1718
{
1819
public string GeneratedMethodName =>
1920
IdentifierHelper.ToValidCSharpMethodName(
20-
$"{Constants.LogMethodPrefix}{Namespace}{ClassName}_{Location.Line}_{Location.Character}"
21+
$"{Constants.LogMethodPrefix}{Namespace}_{ClassName}_{MethodName}_{Location.Line}_{Location.Character}"
2122
);
2223

2324
public bool Equals(LogMessageCall other) =>
2425
Location.Equals(other.Location) &&
2526
Namespace == other.Namespace &&
2627
ClassName == other.ClassName &&
2728
MethodName == other.MethodName &&
29+
LogMethodName == other.LogMethodName &&
2830
LogLevel == other.LogLevel &&
2931
Message == other.Message &&
3032
Parameters.SequenceEqual(other.Parameters);
3133

3234
public override int GetHashCode() =>
33-
(Location, Namespace, ClassName, MethodName, LogLevel, Message, Parameters).GetHashCode();
35+
(Location, Namespace, ClassName, MethodName, LogMethodName, LogLevel, Message, Parameters)
36+
.GetHashCode();
3437
};
3538

src/AutoLoggerMessageGenerator/Models/LoggerScopeCall.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,27 @@ internal readonly record struct LoggerScopeCall(
88
string Namespace,
99
string ClassName,
1010
string MethodName,
11+
string LogScopeMethodName,
1112
string Message,
1213
ImmutableArray<CallParameter> Parameters
1314
)
1415
{
1516
public string GeneratedMethodName =>
1617
IdentifierHelper.ToValidCSharpMethodName(
17-
$"{Constants.LogScopeMethodPrefix}{Namespace}{ClassName}_{Location.Line}_{Location.Character}"
18+
$"{Constants.LogScopeMethodPrefix}{Namespace}_{ClassName}_{MethodName}_{Location.Line}_{Location.Character}"
1819
);
1920

2021
public bool Equals(LoggerScopeCall other) =>
2122
Location.Equals(other.Location) &&
2223
Namespace == other.Namespace &&
2324
ClassName == other.ClassName &&
2425
MethodName == other.MethodName &&
26+
LogScopeMethodName == other.LogScopeMethodName &&
2527
Message == other.Message &&
2628
Parameters.SequenceEqual(other.Parameters);
2729

28-
public override int GetHashCode() => (Location, Namespace, ClassName, MethodName, Message, Parameters).GetHashCode();
30+
public override int GetHashCode() =>
31+
(Location, Namespace, ClassName, MethodName, LogScopeMethodName, Message, Parameters)
32+
.GetHashCode();
2933
};
3034

tests/AutoLoggerMessageGenerator.UnitTests/BaseSourceGeneratorTest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ internal abstract class BaseSourceGeneratorTest
1010
public const string LoggerName = "logger";
1111
public const string Namespace = "Foo";
1212
public const string ClassName = "Test";
13+
public const string Method = "Main";
1314

1415
protected static async Task<(CSharpCompilation Compilation, SyntaxTree SyntaxTree)> CompileSourceCode(
1516
string body, string additionalClassMemberDeclarations = "",
@@ -25,7 +26,7 @@ public class {{ClassName}}(ILogger {{LoggerName}})
2526
{
2627
{{additionalClassMemberDeclarations}}
2728
28-
public void Main()
29+
public void {{Method}}()
2930
{
3031
{{body}}
3132
}

tests/AutoLoggerMessageGenerator.UnitTests/Caching/LogCallInputSourceComparerTests.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,16 @@ private static InputSource CreateInputSource(Compilation? compilation = default,
9595
references ??= [new Reference("some lib", new Version("1.2.3"))];
9696
logCalls ??=
9797
[
98-
new LogMessageCall(Guid.NewGuid(), MockLogCallLocationBuilder.Build("some file", 1, 2), "namespace", "class", "name",
99-
"information", "message", [])
98+
new LogMessageCall(
99+
Guid.NewGuid(),
100+
MockLogCallLocationBuilder.Build("some file", 1, 2),
101+
"namespace",
102+
"class",
103+
"method",
104+
"name",
105+
"information",
106+
"message",
107+
[])
100108
];
101109

102110
return new InputSource(compilation, (configuration.Value, (references.Value, logCalls.Value)));

tests/AutoLoggerMessageGenerator.UnitTests/Emitters/LoggerInterceptorsEmitterTests.Emit_ShouldGenerateValidLoggingExtensionsAttribute_Roslyn_4_11.verified.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@ namespace Microsoft.Extensions.Logging.AutoLoggerMessage
1212
internal static class LoggerInterceptors
1313
{
1414
[FakeInterceptableLocation(-1, "ZmlsZSgxLDExKQ==")]
15-
public static void Log_namespace1class1_1_11(this ILogger @logger, string @message)
15+
public static void Log_namespace1_class1_method1_1_11(this ILogger @logger, string @message)
1616
{
17-
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1class1_1_11(@logger);
17+
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1_class1_method1_1_11(@logger);
1818
}
1919

2020
[FakeInterceptableLocation(-1, "ZmlsZTIoMiwyMik=")]
21-
public static void Log_namespace2class2_2_22(this ILogger @logger, string @message, int @intParam)
21+
public static void Log_namespace2_class2_method2_2_22(this ILogger @logger, string @message, int @intParam)
2222
{
23-
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace2class2_2_22(@logger, @intParam);
23+
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace2_class2_method2_2_22(@logger, @intParam);
2424
}
2525

2626
[FakeInterceptableLocation(-1, "ZmlsZTMoMywzMyk=")]
27-
public static void Log_namespace3class3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
27+
public static void Log_namespace3_class3_method3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
2828
{
29-
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace3class3_3_33(@logger, @intParam, @boolParam, @objectParam);
29+
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace3_class3_method3_3_33(@logger, @intParam, @boolParam, @objectParam);
3030
}
3131

3232
}

tests/AutoLoggerMessageGenerator.UnitTests/Emitters/LoggerInterceptorsEmitterTests.Emit_ShouldGenerateValidLoggingExtensionsAttribute_Roslyn_4_14.verified.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@ namespace Microsoft.Extensions.Logging.AutoLoggerMessage
1313
internal static class LoggerInterceptors
1414
{
1515
[FakeInterceptableLocation(-1, "ZmlsZSgxLDExKQ==")]
16-
public static void Log_namespace1class1_1_11(this ILogger @logger, string @message)
16+
public static void Log_namespace1_class1_method1_1_11(this ILogger @logger, string @message)
1717
{
18-
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1class1_1_11(@logger);
18+
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1_class1_method1_1_11(@logger);
1919
}
2020

2121
[FakeInterceptableLocation(-1, "ZmlsZTIoMiwyMik=")]
22-
public static void Log_namespace2class2_2_22(this ILogger @logger, string @message, int @intParam)
22+
public static void Log_namespace2_class2_method2_2_22(this ILogger @logger, string @message, int @intParam)
2323
{
24-
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace2class2_2_22(@logger, @intParam);
24+
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace2_class2_method2_2_22(@logger, @intParam);
2525
}
2626

2727
[FakeInterceptableLocation(-1, "ZmlsZTMoMywzMyk=")]
28-
public static void Log_namespace3class3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
28+
public static void Log_namespace3_class3_method3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
2929
{
30-
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace3class3_3_33(@logger, @intParam, @boolParam, @objectParam);
30+
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace3_class3_method3_3_33(@logger, @intParam, @boolParam, @objectParam);
3131
}
3232

3333
}

0 commit comments

Comments
 (0)