Skip to content

Commit e477cf7

Browse files
authored
Actor timer callback method analyzer (#1513)
* Removed obsolete project from solution (Messaging) * Added project containing analyzers and tests with respect to Dapr.Actors. The starting analyzer in this package validates that there's a method on the actor type matching the name provided in the timer callback argument. Signed-off-by: Whit Waldo <[email protected]>
1 parent aa70c5b commit e477cf7

13 files changed

+491
-12
lines changed

Directory.Packages.props

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<PackageVersion Include="BenchmarkDotNet" Version="0.14.0" />
88
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
99
<PackageVersion Include="coverlet.msbuild" Version="6.0.2" />
10-
<PackageVersion Include="GitHubActionsTestLogger" Version="1.1.2" />
10+
<PackageVersion Include="GitHubActionsTestLogger" Version="2.4.1" />
1111
<PackageVersion Include="Google.Api.CommonProtos" Version="2.2.0" />
1212
<PackageVersion Include="Google.Protobuf" Version="3.28.2" />
1313
<PackageVersion Include="Grpc.AspNetCore" Version="2.66.0" />
@@ -17,12 +17,14 @@
1717
<PackageVersion Include="Grpc.Tools" Version="2.67.0" />
1818
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.35" />
1919
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="6.0.35" />
20-
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
21-
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.8.0" />
22-
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
20+
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0" />
21+
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.13.0" />
22+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
23+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing" Version="1.1.2" />
24+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.XUnit" Version="1.1.2" />
2325
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing" Version="1.1.2" />
2426
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit" Version="1.1.2" />
25-
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.8.0" />
27+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.13.0" />
2628
<PackageVersion Include="Microsoft.DurableTask.Client.Grpc" Version="1.5.0" />
2729
<PackageVersion Include="Microsoft.DurableTask.Worker.Grpc" Version="1.5.0" />
2830
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
@@ -33,7 +35,7 @@
3335
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.4" />
3436
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
3537
<PackageVersion Include="Microsoft.Extensions.Http" Version="6.0.0" />
36-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
38+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
3739
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="1.1.1" />
3840
<PackageVersion Include="MinVer" Version="2.3.0" />
3941
<PackageVersion Include="Moq" Version="4.20.72" />
@@ -45,8 +47,8 @@
4547
<PackageVersion Include="Shouldly" Version="4.2.1" />
4648
<PackageVersion Include="System.Formats.Asn1" Version="6.0.1" />
4749
<PackageVersion Include="System.Text.Json" Version="6.0.10" />
48-
<PackageVersion Include="xunit" Version="2.9.2" />
49-
<PackageVersion Include="xunit.extensibility.core" Version="2.9.2" />
50-
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
50+
<PackageVersion Include="xunit" Version="2.9.3" />
51+
<PackageVersion Include="xunit.extensibility.core" Version="2.9.3" />
52+
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
5153
</ItemGroup>
5254
</Project>

all.sln

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JobsSample", "examples\Jobs
155155
EndProject
156156
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.Workflow.Test", "test\Dapr.Workflow.Test\Dapr.Workflow.Test.csproj", "{E90114C6-86FC-43B8-AE5C-D9273CF21FE4}"
157157
EndProject
158-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Messaging", "Messaging", "{8DB002D2-19E9-4342-A86B-025A367DF3D1}"
158+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.Actors.Analyzers", "src\Dapr.Actors.Analyzers\Dapr.Actors.Analyzers\Dapr.Actors.Analyzers.csproj", "{E49C822C-E921-48DF-897B-3E603CA596D2}"
159+
EndProject
160+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.Actors.Analyzers.Tests", "test\Dapr.Actors.Analyzers.Tests\Dapr.Actors.Analyzers.Tests.csproj", "{A2C0F203-11FF-4B7F-A94F-B9FD873573FE}"
159161
EndProject
160162
Global
161163
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -405,6 +407,14 @@ Global
405407
{E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
406408
{E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
407409
{E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|Any CPU.Build.0 = Release|Any CPU
410+
{E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
411+
{E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|Any CPU.Build.0 = Debug|Any CPU
412+
{E49C822C-E921-48DF-897B-3E603CA596D2}.Release|Any CPU.ActiveCfg = Release|Any CPU
413+
{E49C822C-E921-48DF-897B-3E603CA596D2}.Release|Any CPU.Build.0 = Release|Any CPU
414+
{A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
415+
{A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
416+
{A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
417+
{A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|Any CPU.Build.0 = Release|Any CPU
408418
EndGlobalSection
409419
GlobalSection(SolutionProperties) = preSolution
410420
HideSolutionNode = FALSE
@@ -478,8 +488,8 @@ Global
478488
{D9697361-232F-465D-A136-4561E0E88488} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78}
479489
{9CAF360E-5AD3-4C4F-89A0-327EEB70D673} = {D9697361-232F-465D-A136-4561E0E88488}
480490
{E90114C6-86FC-43B8-AE5C-D9273CF21FE4} = {DD020B34-460F-455F-8D17-CF4A949F100B}
481-
{8DB002D2-19E9-4342-A86B-025A367DF3D1} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78}
482-
{290D1278-F613-4DF3-9DF5-F37E38CDC363} = {8DB002D2-19E9-4342-A86B-025A367DF3D1}
491+
{E49C822C-E921-48DF-897B-3E603CA596D2} = {27C5D71D-0721-4221-9286-B94AB07B58CF}
492+
{A2C0F203-11FF-4B7F-A94F-B9FD873573FE} = {DD020B34-460F-455F-8D17-CF4A949F100B}
483493
EndGlobalSection
484494
GlobalSection(ExtensibilityGlobals) = postSolution
485495
SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
3+
## Release 1.16.0
4+
5+
### New Rules
6+
7+
Rule ID | Category | Severity | Notes
8+
--------|----------|----------|------------------------------------------------------------------------------------
9+
DAPR4001 | Usage | Warning | Actor timer method invocations require the named callback method to exist on type.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
; Unshipped analyzer release
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// ------------------------------------------------------------------------
2+
// Copyright 2025 The Dapr Authors
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
// Unless required by applicable law or agreed to in writing, software
8+
// distributed under the License is distributed on an "AS IS" BASIS,
9+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
// See the License for the specific language governing permissions and
11+
// limitations under the License.
12+
// ------------------------------------------------------------------------
13+
14+
using System.Runtime.CompilerServices;
15+
16+
[assembly: InternalsVisibleTo("Dapr.Actors.Analyzers.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2" )]
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<TargetFrameworks></TargetFrameworks>
6+
<IsPackable>false</IsPackable>
7+
<ImplicitUsings>enable</ImplicitUsings>
8+
<Nullable>enable</Nullable>
9+
<Description>This package contains Roslyn analyzers for Dapr.Actors.</Description>
10+
11+
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
12+
</PropertyGroup>
13+
14+
<ItemGroup>
15+
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers">
16+
<PrivateAssets>all</PrivateAssets>
17+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
18+
</PackageReference>
19+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp"/>
20+
</ItemGroup>
21+
22+
<ItemGroup>
23+
<EmbeddedResource Update="Resources.resx">
24+
<Generator>ResXFileCodeGenerator</Generator>
25+
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
26+
</EmbeddedResource>
27+
</ItemGroup>
28+
29+
<ItemGroup>
30+
<Compile Update="Resources.Designer.cs">
31+
<DesignTime>True</DesignTime>
32+
<AutoGen>True</AutoGen>
33+
<DependentUpon>Resources.resx</DependentUpon>
34+
</Compile>
35+
</ItemGroup>
36+
37+
</Project>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"$schema": "https://json.schemastore.org/launchsettings.json",
3+
"profiles": {
4+
"DebugRoslynAnalyzers": {
5+
"commandName": "DebugRoslynComponent",
6+
"targetProject": "../Dapr.Actors.Analyzers.Sample/Dapr.Actors.Analyzers.Sample.csproj"
7+
}
8+
}
9+
}

src/Dapr.Actors.Analyzers/Dapr.Actors.Analyzers/Readme.md

Whitespace-only changes.

src/Dapr.Actors.Analyzers/Dapr.Actors.Analyzers/Resources.Designer.cs

Lines changed: 80 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
3+
<root>
4+
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
5+
<xsd:element name="root" msdata:IsDataSet="true">
6+
7+
</xsd:element>
8+
</xsd:schema>
9+
<resheader name="resmimetype">
10+
<value>text/microsoft-resx</value>
11+
</resheader>
12+
<resheader name="version">
13+
<value>1.3</value>
14+
</resheader>
15+
<resheader name="reader">
16+
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
17+
</resheader>
18+
<resheader name="writer">
19+
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
20+
</resheader>
21+
<data name="DAPR4001Title" xml:space="preserve">
22+
<value>Actor timer method invocations require the named callback method to exist on type</value>
23+
</data>
24+
<data name="DAPR4001MessageFormat" xml:space="preserve">
25+
<value>Actor timer method invocations require the named callback '{0}' method to exist on type '{1}'</value>
26+
</data>
27+
</root>

0 commit comments

Comments
 (0)