Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace AutoLoggerMessageGenerator.Extractors;

internal static class LocationContextExtractor
{
public static LocationContext Extract(InvocationExpressionSyntax invocationExpression)
{
string? className = null, ns = null, methodName = null;

SyntaxNode syntaxNode = invocationExpression;
while (syntaxNode.Parent is not null)
{
if (className is null && syntaxNode is ClassDeclarationSyntax classDeclarationSyntax)
className = classDeclarationSyntax.Identifier.Text;

if (ns is null)
{
if (syntaxNode is NamespaceDeclarationSyntax namespaceDeclarationSyntax)
ns = namespaceDeclarationSyntax.Name.ToString();

if (syntaxNode is FileScopedNamespaceDeclarationSyntax fileScopedNamespaceDeclarationSyntax)
ns = fileScopedNamespaceDeclarationSyntax.Name.ToString();
}

if (methodName is null && syntaxNode is MethodDeclarationSyntax methodDeclarationSyntax)
methodName = methodDeclarationSyntax.Identifier.Text;

syntaxNode = syntaxNode.Parent;
}

return new LocationContext(
ns ?? string.Empty, className ?? string.Empty, methodName ?? string.Empty
);
}

public record LocationContext(string Namespace, string ClassName, string MethodName);
}
14 changes: 12 additions & 2 deletions src/AutoLoggerMessageGenerator/Extractors/LogCallExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ internal static class LogCallExtractor
InvocationExpressionSyntax invocationExpression,
SemanticModel semanticModel)
{
var (ns, className) = EnclosingClassExtractor.Extract(invocationExpression);
var (ns, className, parentMethodName) = LocationContextExtractor.Extract(invocationExpression);

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

return new LogMessageCall(Guid.NewGuid(), location.Value, ns, className, methodSymbol.Name, logLevel, message, parameters.Value);
return new LogMessageCall(
Guid.NewGuid(),
location.Value,
ns,
className,
parentMethodName,
methodSymbol.Name,
logLevel,
message,
parameters.Value
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ internal static class LoggerScopeCallExtractor
InvocationExpressionSyntax invocationExpression,
SemanticModel semanticModel)
{
var (ns, className) = EnclosingClassExtractor.Extract(invocationExpression);
var (ns, className, parentMethodName) = LocationContextExtractor.Extract(invocationExpression);

var location = CallLocationMapper.Map(semanticModel, invocationExpression);
if (location is null)
Expand All @@ -29,6 +29,6 @@ internal static class LoggerScopeCallExtractor
if (parameters is null)
return default;

return new LoggerScopeCall(location.Value, ns, className, methodSymbol.Name, message, parameters.Value);
return new LoggerScopeCall(location.Value, ns, className, parentMethodName, methodSymbol.Name, message, parameters.Value);
}
}
7 changes: 5 additions & 2 deletions src/AutoLoggerMessageGenerator/Models/LogMessageCall.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,29 @@ internal readonly record struct LogMessageCall(
string Namespace,
string ClassName,
string MethodName,
string LogMethodName,
string LogLevel,
string Message,
ImmutableArray<CallParameter> Parameters
)
{
public string GeneratedMethodName =>
IdentifierHelper.ToValidCSharpMethodName(
$"{Constants.LogMethodPrefix}{Namespace}{ClassName}_{Location.Line}_{Location.Character}"
$"{Constants.LogMethodPrefix}{Namespace}_{ClassName}_{MethodName}_{Location.Line}_{Location.Character}"
);

public bool Equals(LogMessageCall other) =>
Location.Equals(other.Location) &&
Namespace == other.Namespace &&
ClassName == other.ClassName &&
MethodName == other.MethodName &&
LogMethodName == other.LogMethodName &&
LogLevel == other.LogLevel &&
Message == other.Message &&
Parameters.SequenceEqual(other.Parameters);

public override int GetHashCode() =>
(Location, Namespace, ClassName, MethodName, LogLevel, Message, Parameters).GetHashCode();
(Location, Namespace, ClassName, MethodName, LogMethodName, LogLevel, Message, Parameters)
.GetHashCode();
};

8 changes: 6 additions & 2 deletions src/AutoLoggerMessageGenerator/Models/LoggerScopeCall.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,27 @@ internal readonly record struct LoggerScopeCall(
string Namespace,
string ClassName,
string MethodName,
string LogScopeMethodName,
string Message,
ImmutableArray<CallParameter> Parameters
)
{
public string GeneratedMethodName =>
IdentifierHelper.ToValidCSharpMethodName(
$"{Constants.LogScopeMethodPrefix}{Namespace}{ClassName}_{Location.Line}_{Location.Character}"
$"{Constants.LogScopeMethodPrefix}{Namespace}_{ClassName}_{MethodName}_{Location.Line}_{Location.Character}"
);

public bool Equals(LoggerScopeCall other) =>
Location.Equals(other.Location) &&
Namespace == other.Namespace &&
ClassName == other.ClassName &&
MethodName == other.MethodName &&
LogScopeMethodName == other.LogScopeMethodName &&
Message == other.Message &&
Parameters.SequenceEqual(other.Parameters);

public override int GetHashCode() => (Location, Namespace, ClassName, MethodName, Message, Parameters).GetHashCode();
public override int GetHashCode() =>
(Location, Namespace, ClassName, MethodName, LogScopeMethodName, Message, Parameters)
.GetHashCode();
};

Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ internal abstract class BaseSourceGeneratorTest
public const string LoggerName = "logger";
public const string Namespace = "Foo";
public const string ClassName = "Test";
public const string Method = "Main";

protected static async Task<(CSharpCompilation Compilation, SyntaxTree SyntaxTree)> CompileSourceCode(
string body, string additionalClassMemberDeclarations = "",
Expand All @@ -25,7 +26,7 @@ public class {{ClassName}}(ILogger {{LoggerName}})
{
{{additionalClassMemberDeclarations}}

public void Main()
public void {{Method}}()
{
{{body}}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,16 @@ private static InputSource CreateInputSource(Compilation? compilation = default,
references ??= [new Reference("some lib", new Version("1.2.3"))];
logCalls ??=
[
new LogMessageCall(Guid.NewGuid(), MockLogCallLocationBuilder.Build("some file", 1, 2), "namespace", "class", "name",
"information", "message", [])
new LogMessageCall(
Guid.NewGuid(),
MockLogCallLocationBuilder.Build("some file", 1, 2),
"namespace",
"class",
"method",
"name",
"information",
"message",
[])
];

return new InputSource(compilation, (configuration.Value, (references.Value, logCalls.Value)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@ namespace Microsoft.Extensions.Logging.AutoLoggerMessage
internal static class LoggerInterceptors
{
[FakeInterceptableLocation(-1, "ZmlsZSgxLDExKQ==")]
public static void Log_namespace1class1_1_11(this ILogger @logger, string @message)
public static void Log_namespace1_class1_method1_1_11(this ILogger @logger, string @message)
{
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1class1_1_11(@logger);
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1_class1_method1_1_11(@logger);
}

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

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

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,21 @@ namespace Microsoft.Extensions.Logging.AutoLoggerMessage
internal static class LoggerInterceptors
{
[FakeInterceptableLocation(-1, "ZmlsZSgxLDExKQ==")]
public static void Log_namespace1class1_1_11(this ILogger @logger, string @message)
public static void Log_namespace1_class1_method1_1_11(this ILogger @logger, string @message)
{
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1class1_1_11(@logger);
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1_class1_method1_1_11(@logger);
}

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

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

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@ namespace Microsoft.Extensions.Logging.AutoLoggerMessage
internal static class LoggerInterceptors
{
[FakeInterceptableLocation(-1, "ZmlsZSgxLDExKQ==")]
public static void Log_namespace1class1_1_11(this ILogger @logger, string @message)
public static void Log_namespace1_class1_method1_1_11(this ILogger @logger, string @message)
{
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1class1_1_11(@logger);
Microsoft.Extensions.Logging.AutoLoggerMessage.AutoLoggerMessage.Log_namespace1_class1_method1_1_11(@logger);
}

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

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

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ public async Task Emit_ShouldGenerateValidLoggingExtensionsAttribute()
Location: MockLogCallLocationBuilder.Build("file", 1, 11),
Namespace: "namespace1",
ClassName: "class1",
MethodName: "name1",
MethodName: "method1",
LogMethodName: "name1",
LogLevel: "Information",
Message: "Message1",
Parameters: [new CallParameter("string", MessageParameterName, CallParameterType.Message)]
Expand All @@ -29,7 +30,8 @@ public async Task Emit_ShouldGenerateValidLoggingExtensionsAttribute()
Location: MockLogCallLocationBuilder.Build("file2", 2, 22),
Namespace: "namespace2",
ClassName: "class2",
MethodName: "name2",
MethodName: "method2",
LogMethodName: "name2",
LogLevel: "Warning",
Message: "Message2",
Parameters: [
Expand All @@ -42,7 +44,8 @@ public async Task Emit_ShouldGenerateValidLoggingExtensionsAttribute()
Location: MockLogCallLocationBuilder.Build("file3", 3, 33),
Namespace: "namespace3",
ClassName: "class3",
MethodName: "name3",
MethodName: "method3",
LogMethodName: "name3",
LogLevel: "Error",
Message: "Message3",
Parameters: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@ namespace Microsoft.Extensions.Logging.AutoLoggerMessage
internal static class LoggerScopeInterceptors
{
[FakeInterceptableLocation(-1, "ZmlsZSgxLDExKQ==")]
public static IDisposable? LogScope_namespace1class1_1_11(this ILogger @logger, string @message)
public static IDisposable? LogScope_namespace1_class1_method1_1_11(this ILogger @logger, string @message)
{
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace1class1_1_11(@logger);
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace1_class1_method1_1_11(@logger);
}

[FakeInterceptableLocation(-1, "ZmlsZTIoMiwyMik=")]
public static IDisposable? LogScope_namespace2class2_2_22(this ILogger @logger, string @message, int @intParam)
public static IDisposable? LogScope_namespace2_class2_method2_2_22(this ILogger @logger, string @message, int @intParam)
{
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace2class2_2_22(@logger, @intParam);
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace2_class2_method2_2_22(@logger, @intParam);
}

[FakeInterceptableLocation(-1, "ZmlsZTMoMywzMyk=")]
public static IDisposable? LogScope_namespace3class3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
public static IDisposable? LogScope_namespace3_class3_method3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
{
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace3class3_3_33(@logger, @intParam, @boolParam, @objectParam);
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace3_class3_method3_3_33(@logger, @intParam, @boolParam, @objectParam);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,21 @@ namespace Microsoft.Extensions.Logging.AutoLoggerMessage
internal static class LoggerScopeInterceptors
{
[FakeInterceptableLocation(-1, "ZmlsZSgxLDExKQ==")]
public static IDisposable? LogScope_namespace1class1_1_11(this ILogger @logger, string @message)
public static IDisposable? LogScope_namespace1_class1_method1_1_11(this ILogger @logger, string @message)
{
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace1class1_1_11(@logger);
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace1_class1_method1_1_11(@logger);
}

[FakeInterceptableLocation(-1, "ZmlsZTIoMiwyMik=")]
public static IDisposable? LogScope_namespace2class2_2_22(this ILogger @logger, string @message, int @intParam)
public static IDisposable? LogScope_namespace2_class2_method2_2_22(this ILogger @logger, string @message, int @intParam)
{
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace2class2_2_22(@logger, @intParam);
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace2_class2_method2_2_22(@logger, @intParam);
}

[FakeInterceptableLocation(-1, "ZmlsZTMoMywzMyk=")]
public static IDisposable? LogScope_namespace3class3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
public static IDisposable? LogScope_namespace3_class3_method3_3_33(this ILogger @logger, string @message, int @intParam, bool @boolParam, SomeClass @objectParam)
{
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace3class3_3_33(@logger, @intParam, @boolParam, @objectParam);
return Microsoft.Extensions.Logging.AutoLoggerMessage.LoggerScopes.LogScope_namespace3_class3_method3_3_33(@logger, @intParam, @boolParam, @objectParam);
}

}
Expand Down
Loading