Skip to content

Commit 9a89325

Browse files
committed
Use cache for getting message template attribute. Relates #57
1 parent 7b51a8a commit 9a89325

10 files changed

+114
-36
lines changed

src/ReSharper.Structured.Logging/Analyzer/AnonymousTypeDestructureAnalyzer.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
using JetBrains.ReSharper.Feature.Services.Daemon;
44
using JetBrains.ReSharper.Psi;
5+
using JetBrains.ReSharper.Psi.CodeAnnotations;
56
using JetBrains.ReSharper.Psi.CSharp.Tree;
67

8+
using ReSharper.Structured.Logging.Caching;
79
using ReSharper.Structured.Logging.Extensions;
810
using ReSharper.Structured.Logging.Highlighting;
911
using ReSharper.Structured.Logging.Serilog.Parsing;
@@ -15,17 +17,20 @@ public class AnonymousTypeDestructureAnalyzer : ElementProblemAnalyzer<IInvocati
1517
{
1618
private readonly MessageTemplateParser _messageTemplateParser;
1719

18-
public AnonymousTypeDestructureAnalyzer(MessageTemplateParser messageTemplateParser)
20+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
21+
22+
public AnonymousTypeDestructureAnalyzer(MessageTemplateParser messageTemplateParser, CodeAnnotationsCache codeAnnotationsCache)
1923
{
2024
_messageTemplateParser = messageTemplateParser;
25+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
2126
}
2227

2328
protected override void Run(
2429
IInvocationExpression element,
2530
ElementProblemAnalyzerData data,
2631
IHighlightingConsumer consumer)
2732
{
28-
var templateArgument = element.GetTemplateArgument();
33+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
2934
if (templateArgument == null)
3035
{
3136
return;

src/ReSharper.Structured.Logging/Analyzer/CompileTimeConstantTemplateAnalyzer.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using JetBrains.ReSharper.Feature.Services.Daemon;
2+
using JetBrains.ReSharper.Psi.CodeAnnotations;
23
using JetBrains.ReSharper.Psi.CSharp.Tree;
34
using JetBrains.ReSharper.Psi.Tree;
45

6+
using ReSharper.Structured.Logging.Caching;
57
using ReSharper.Structured.Logging.Extensions;
68
using ReSharper.Structured.Logging.Highlighting;
79

@@ -10,12 +12,19 @@ namespace ReSharper.Structured.Logging.Analyzer
1012
[ElementProblemAnalyzer(typeof(IInvocationExpression))]
1113
public class CompileTimeConstantTemplateAnalyzer : ElementProblemAnalyzer<IInvocationExpression>
1214
{
15+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
16+
17+
public CompileTimeConstantTemplateAnalyzer(CodeAnnotationsCache codeAnnotationsCache)
18+
{
19+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
20+
}
21+
1322
protected override void Run(
1423
IInvocationExpression element,
1524
ElementProblemAnalyzerData data,
1625
IHighlightingConsumer consumer)
1726
{
18-
var templateArgument = element.GetTemplateArgument();
27+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
1928
if (templateArgument?.Value == null)
2029
{
2130
return;

src/ReSharper.Structured.Logging/Analyzer/ComplexObjectDestructureAnalyzer.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
using JetBrains.Metadata.Reader.Impl;
66
using JetBrains.ReSharper.Feature.Services.Daemon;
77
using JetBrains.ReSharper.Psi;
8+
using JetBrains.ReSharper.Psi.CodeAnnotations;
89
using JetBrains.ReSharper.Psi.CSharp.Tree;
910
using JetBrains.ReSharper.Psi.Util;
1011

12+
using ReSharper.Structured.Logging.Caching;
1113
using ReSharper.Structured.Logging.Extensions;
1214
using ReSharper.Structured.Logging.Highlighting;
1315
using ReSharper.Structured.Logging.Serilog.Parsing;
@@ -21,9 +23,12 @@ public class ComplexObjectDestructureAnalyzer : ElementProblemAnalyzer<IInvocati
2123

2224
private readonly MessageTemplateParser _messageTemplateParser;
2325

24-
public ComplexObjectDestructureAnalyzer(MessageTemplateParser messageTemplateParser)
26+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
27+
28+
public ComplexObjectDestructureAnalyzer(MessageTemplateParser messageTemplateParser, CodeAnnotationsCache codeAnnotationsCache)
2529
{
2630
_messageTemplateParser = messageTemplateParser;
31+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
2732
}
2833

2934
protected override void Run(
@@ -59,7 +64,7 @@ private void CheckComplexObjectInContext(IInvocationExpression element, IHighlig
5964

6065
private void CheckComplexObjectInTemplate(IInvocationExpression element, IHighlightingConsumer consumer)
6166
{
62-
var templateArgument = element.GetTemplateArgument();
67+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
6368
if (templateArgument == null)
6469
{
6570
return;

src/ReSharper.Structured.Logging/Analyzer/CorrectExceptionPassingAnalyzer.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
using JetBrains.Metadata.Reader.API;
33
using JetBrains.ReSharper.Feature.Services.Daemon;
44
using JetBrains.ReSharper.Psi;
5+
using JetBrains.ReSharper.Psi.CodeAnnotations;
56
using JetBrains.ReSharper.Psi.CSharp.Tree;
67
using JetBrains.ReSharper.Psi.Util;
78

9+
using ReSharper.Structured.Logging.Caching;
810
using ReSharper.Structured.Logging.Extensions;
911
using ReSharper.Structured.Logging.Highlighting;
1012

@@ -13,12 +15,19 @@ namespace ReSharper.Structured.Logging.Analyzer
1315
[ElementProblemAnalyzer(typeof(IInvocationExpression))]
1416
public class CorrectExceptionPassingAnalyzer : ElementProblemAnalyzer<IInvocationExpression>
1517
{
18+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
19+
20+
public CorrectExceptionPassingAnalyzer(CodeAnnotationsCache codeAnnotationsCache)
21+
{
22+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
23+
}
24+
1625
protected override void Run(
1726
IInvocationExpression element,
1827
ElementProblemAnalyzerData data,
1928
IHighlightingConsumer consumer)
2029
{
21-
var templateArgument = element.GetTemplateArgument();
30+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
2231
if (templateArgument == null)
2332
{
2433
return;

src/ReSharper.Structured.Logging/Analyzer/DuplicatePropertiesTemplateAnalyzer.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System.Linq;
22

33
using JetBrains.ReSharper.Feature.Services.Daemon;
4+
using JetBrains.ReSharper.Psi.CodeAnnotations;
45
using JetBrains.ReSharper.Psi.CSharp.Tree;
56

7+
using ReSharper.Structured.Logging.Caching;
68
using ReSharper.Structured.Logging.Extensions;
79
using ReSharper.Structured.Logging.Highlighting;
810
using ReSharper.Structured.Logging.Serilog.Parsing;
@@ -14,17 +16,20 @@ public class DuplicatePropertiesTemplateAnalyzer : ElementProblemAnalyzer<IInvoc
1416
{
1517
private readonly MessageTemplateParser _messageTemplateParser;
1618

17-
public DuplicatePropertiesTemplateAnalyzer(MessageTemplateParser messageTemplateParser)
19+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
20+
21+
public DuplicatePropertiesTemplateAnalyzer(MessageTemplateParser messageTemplateParser, CodeAnnotationsCache codeAnnotationsCache)
1822
{
1923
_messageTemplateParser = messageTemplateParser;
24+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
2025
}
2126

2227
protected override void Run(
2328
IInvocationExpression element,
2429
ElementProblemAnalyzerData data,
2530
IHighlightingConsumer consumer)
2631
{
27-
var templateArgument = element.GetTemplateArgument();
32+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
2833
var templateText = templateArgument?.TryGetTemplateText();
2934
if (templateText == null)
3035
{

src/ReSharper.Structured.Logging/Analyzer/LogMessageIsSentenceAnalyzer.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System.Text.RegularExpressions;
22

33
using JetBrains.ReSharper.Feature.Services.Daemon;
4+
using JetBrains.ReSharper.Psi.CodeAnnotations;
45
using JetBrains.ReSharper.Psi.CSharp.Tree;
56
using JetBrains.ReSharper.Psi.Util;
67

8+
using ReSharper.Structured.Logging.Caching;
79
using ReSharper.Structured.Logging.Extensions;
810
using ReSharper.Structured.Logging.Highlighting;
911

@@ -12,11 +14,18 @@ namespace ReSharper.Structured.Logging.Analyzer
1214
[ElementProblemAnalyzer(typeof(IInvocationExpression))]
1315
public class LogMessageIsSentenceAnalyzer : ElementProblemAnalyzer<IInvocationExpression>
1416
{
17+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
18+
1519
private static readonly Regex DotAtTheEnd = new Regex(@"(?<!\.)\.$", RegexOptions.Compiled);
1620

21+
public LogMessageIsSentenceAnalyzer(CodeAnnotationsCache codeAnnotationsCache)
22+
{
23+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
24+
}
25+
1726
protected override void Run(IInvocationExpression element, ElementProblemAnalyzerData data, IHighlightingConsumer consumer)
1827
{
19-
var templateArgument = element.GetTemplateArgument();
28+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
2029
var lastFragmentExpression = templateArgument?.TryCreateLastTemplateFragmentExpression();
2130
if (lastFragmentExpression == null)
2231
{

src/ReSharper.Structured.Logging/Analyzer/PositionalPropertiesUsageAnalyzer.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using JetBrains.ReSharper.Feature.Services.Daemon;
2+
using JetBrains.ReSharper.Psi.CodeAnnotations;
23
using JetBrains.ReSharper.Psi.CSharp.Tree;
34

5+
using ReSharper.Structured.Logging.Caching;
46
using ReSharper.Structured.Logging.Extensions;
57
using ReSharper.Structured.Logging.Highlighting;
68
using ReSharper.Structured.Logging.Serilog.Parsing;
@@ -12,17 +14,20 @@ public class PositionalPropertiesUsageAnalyzer : ElementProblemAnalyzer<IInvocat
1214
{
1315
private readonly MessageTemplateParser _messageTemplateParser;
1416

15-
public PositionalPropertiesUsageAnalyzer(MessageTemplateParser messageTemplateParser)
17+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
18+
19+
public PositionalPropertiesUsageAnalyzer(MessageTemplateParser messageTemplateParser, CodeAnnotationsCache codeAnnotationsCache)
1620
{
1721
_messageTemplateParser = messageTemplateParser;
22+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
1823
}
1924

2025
protected override void Run(
2126
IInvocationExpression element,
2227
ElementProblemAnalyzerData data,
2328
IHighlightingConsumer consumer)
2429
{
25-
var templateArgument = element.GetTemplateArgument();
30+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
2631
var templateText = templateArgument?.TryGetTemplateText();
2732
if (templateText == null)
2833
{

src/ReSharper.Structured.Logging/Analyzer/PropertiesNamingAnalyzer.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using JetBrains.Application.Settings;
22
using JetBrains.ProjectModel;
33
using JetBrains.ReSharper.Feature.Services.Daemon;
4+
using JetBrains.ReSharper.Psi.CodeAnnotations;
45
using JetBrains.ReSharper.Psi.CSharp.Tree;
56
using JetBrains.ReSharper.Psi.Tree;
67
using JetBrains.Util;
78

9+
using ReSharper.Structured.Logging.Caching;
810
using ReSharper.Structured.Logging.Extensions;
911
using ReSharper.Structured.Logging.Highlighting;
1012
using ReSharper.Structured.Logging.Serilog.Parsing;
@@ -17,9 +19,12 @@ public class PropertiesNamingAnalyzer : ElementProblemAnalyzer<IInvocationExpres
1719
{
1820
private readonly MessageTemplateParser _messageTemplateParser;
1921

20-
public PropertiesNamingAnalyzer(MessageTemplateParser messageTemplateParser)
22+
private readonly TemplateParameterNameAttributeProvider _templateParameterNameAttributeProvider;
23+
24+
public PropertiesNamingAnalyzer(MessageTemplateParser messageTemplateParser, CodeAnnotationsCache codeAnnotationsCache)
2125
{
2226
_messageTemplateParser = messageTemplateParser;
27+
_templateParameterNameAttributeProvider = codeAnnotationsCache.GetProvider<TemplateParameterNameAttributeProvider>();
2328
}
2429

2530
protected override void Run(
@@ -42,7 +47,7 @@ private void CheckPropertiesInTemplate(
4247
IHighlightingConsumer consumer,
4348
PropertyNamingType namingType)
4449
{
45-
var templateArgument = element.GetTemplateArgument();
50+
var templateArgument = element.GetTemplateArgument(_templateParameterNameAttributeProvider);
4651
var templateText = templateArgument?.TryGetTemplateText();
4752
if (templateText == null)
4853
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
using JetBrains.ReSharper.Psi;
6+
using JetBrains.ReSharper.Psi.CodeAnnotations;
7+
8+
namespace ReSharper.Structured.Logging.Caching
9+
{
10+
[CodeAnnotationProvider]
11+
public class TemplateParameterNameAttributeProvider : CodeAnnotationInfoProvider<ITypeMember, string>
12+
{
13+
public TemplateParameterNameAttributeProvider(
14+
AttributeInstancesProvider attributeInstancesProvider,
15+
CodeAnnotationsConfiguration codeAnnotationsConfiguration)
16+
: base(attributeInstancesProvider, codeAnnotationsConfiguration, true)
17+
{
18+
}
19+
20+
protected override string CalculateInfo(ITypeMember attributesOwner, IEnumerable<IAttributeInstance> attributeInstances)
21+
{
22+
var templateFormatAttribute = attributesOwner.GetAttributeInstances(AttributesSource.All)
23+
.FirstOrDefault(a => string.Equals(a.GetAttributeShortName(), "MessageTemplateFormatMethodAttribute", StringComparison.Ordinal));
24+
25+
if (templateFormatAttribute != null)
26+
{
27+
return templateFormatAttribute.PositionParameters()
28+
.FirstOrDefault()
29+
?.ConstantValue.Value?.ToString();
30+
}
31+
32+
var className = attributesOwner.GetContainingType()?.GetClrName().FullName;
33+
if (className == "Microsoft.Extensions.Logging.LoggerExtensions")
34+
{
35+
return attributesOwner.ShortName == "BeginScope" ? "messageFormat" : "message";
36+
}
37+
38+
return null;
39+
}
40+
41+
protected override string GetDefaultInfo(ITypeMember attributesOwner)
42+
{
43+
return null;
44+
}
45+
}
46+
}

src/ReSharper.Structured.Logging/Extensions/PsiExtensions.cs

+3-23
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using JetBrains.ReSharper.Psi.Util;
1414
using JetBrains.Util;
1515

16+
using ReSharper.Structured.Logging.Caching;
1617
using ReSharper.Structured.Logging.Models;
1718
using ReSharper.Structured.Logging.Serilog.Parsing;
1819

@@ -23,14 +24,14 @@ public static class PsiExtensions
2324
private static readonly IClrTypeName LogContextFqn = new ClrTypeName("Serilog.Context.LogContext");
2425

2526
[CanBeNull]
26-
public static ICSharpArgument GetTemplateArgument(this IInvocationExpression invocationExpression)
27+
public static ICSharpArgument GetTemplateArgument(this IInvocationExpression invocationExpression, TemplateParameterNameAttributeProvider templateParameterNameAttributeProvider)
2728
{
2829
if (!(invocationExpression.Reference.Resolve().DeclaredElement is ITypeMember typeMember))
2930
{
3031
return null;
3132
}
3233

33-
var templateParameterName = typeMember.GetTemplateParameterName();
34+
var templateParameterName = templateParameterNameAttributeProvider.GetInfo(typeMember);
3435
if (string.IsNullOrEmpty(templateParameterName))
3536
{
3637
return null;
@@ -221,26 +222,5 @@ private static void FlattenAdditiveExpression(IAdditiveExpression additiveExpres
221222
list.AddLast((ExpressionArgumentInfo)argumentInfo);
222223
}
223224
}
224-
225-
private static string GetTemplateParameterName([NotNull] this ITypeMember typeMember)
226-
{
227-
var templateFormatAttribute = typeMember.GetAttributeInstances(AttributesSource.All)
228-
.FirstOrDefault(a => a.GetAttributeShortName() == "MessageTemplateFormatMethodAttribute");
229-
230-
if (templateFormatAttribute != null)
231-
{
232-
return templateFormatAttribute.PositionParameters()
233-
.FirstOrDefault()
234-
?.ConstantValue.Value?.ToString();
235-
}
236-
237-
var className = typeMember.GetContainingType()?.GetClrName().FullName;
238-
if (className == "Microsoft.Extensions.Logging.LoggerExtensions")
239-
{
240-
return typeMember.ShortName == "BeginScope" ? "messageFormat" : "message";
241-
}
242-
243-
return null;
244-
}
245225
}
246226
}

0 commit comments

Comments
 (0)