diff --git a/.github/workflows/publish-nuget.yml b/.github/workflows/publish-nuget.yml
index dac7221f..a6bd8bc9 100644
--- a/.github/workflows/publish-nuget.yml
+++ b/.github/workflows/publish-nuget.yml
@@ -7,6 +7,10 @@ on:
jobs:
call-publish-workflow:
- uses: Lombiq/GitHub-Actions/.github/workflows/publish-nuget.yml@dev
+ uses: Lombiq/GitHub-Actions/.github/workflows/publish-nuget.yml@issue/OSOE-110
+ with:
+ # Don't generate any symbol package because we're not including the Lombiq.Analyzers.dll in the NuGet package
+ # itself, either. See Invoke-BeforePack.ps1 for details.
+ dotnet-pack-include-symbols: "false"
secrets:
API_KEY: ${{ secrets.DEFAULT_NUGET_PUBLISH_API_KEY }}
diff --git a/.github/workflows/test-analysis-failure.yml b/.github/workflows/test-analysis-failure.yml
new file mode 100644
index 00000000..e90cbb29
--- /dev/null
+++ b/.github/workflows/test-analysis-failure.yml
@@ -0,0 +1,35 @@
+name: Test Analysis Failure
+
+# Runs for PRs opened for any branch, and pushes to the dev branch.
+on:
+ pull_request:
+ push:
+ branches:
+ - dev
+
+jobs:
+ call-test-analysis-failure-nuget:
+ name: Test Analysis Failure - NuGet PackageReference
+ uses: Lombiq/GitHub-Actions/.github/workflows/test-analysis-failure.yml@issue/OSOE-110
+ with:
+ machine-types: "[\"ubuntu-latest\", \"windows-latest\"]"
+ build-directory: TestSolutions/Lombiq.Analyzers.PackageReference
+ timeout-minutes: 30
+ build-expected-code-analysis-errors: |
+ IDE0021: Use expression body for constructors.
+ IDE0044: Make field readonly.
+ S2933: Make 'Number' 'readonly'.
+ S4487: Remove this unread private field 'Number' or refactor the code to use its value.
+
+ call-test-analysis-failure-local:
+ name: Test Analysis Failure - Local ProjectReference
+ uses: Lombiq/GitHub-Actions/.github/workflows/test-analysis-failure.yml@issue/OSOE-110
+ with:
+ machine-types: "[\"ubuntu-latest\", \"windows-latest\"]"
+ build-directory: TestSolutions/Lombiq.Analyzers.ProjectReference
+ timeout-minutes: 30
+ build-expected-code-analysis-errors: |
+ IDE0021: Use expression body for constructors.
+ IDE0044: Make field readonly.
+ S2933: Make 'Number' 'readonly'.
+ S4487: Remove this unread private field 'Number' or refactor the code to use its value.
diff --git a/.github/workflows/verify-submodule-pull-request.yml b/.github/workflows/verify-submodule-pull-request.yml
index d6e392ed..d5cfc490 100644
--- a/.github/workflows/verify-submodule-pull-request.yml
+++ b/.github/workflows/verify-submodule-pull-request.yml
@@ -5,4 +5,4 @@ on:
jobs:
call-verify-workflow:
- uses: Lombiq/GitHub-Actions/.github/workflows/verify-submodule-pull-request.yml@dev
+ uses: Lombiq/GitHub-Actions/.github/workflows/verify-submodule-pull-request.yml@issue/OSOE-110
diff --git a/.gitignore b/.gitignore
index 0d410d77..b2b691d4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,7 @@ wwwroot/
node_modules/
*.user
.pnpm-debug.log
+/.editorconfig
+/TestSolutions/**/.editorconfig
+/TestSolutions/Lombiq.Analyzers.*/**/AnalyzerViolations.cs
+/Lombiq.Analyzers/Lombiq.Analyzers.nuspec
diff --git a/CommonPackages.props b/CommonPackages.props
deleted file mode 100644
index b3d4430f..00000000
--- a/CommonPackages.props
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
- all
- runtime; build; native; contentfiles; analyzers;
-
-
-
diff --git a/ConvertTo-Nuspec.ps1 b/ConvertTo-Nuspec.ps1
new file mode 100644
index 00000000..2b61ea57
--- /dev/null
+++ b/ConvertTo-Nuspec.ps1
@@ -0,0 +1,24 @@
+param($Version)
+
+$projectPath = Join-Path $PWD Lombiq.Analyzers
+function Read-Xml([string]$File) { [xml](Get-Content (Join-Path $projectPath $File)) }
+
+$nuspec = Read-Xml Lombiq.Analyzers.nuspec.template
+$dependencies = $nuspec.package.metadata.dependencies
+
+$nuspec.package.metadata.GetElementsByTagName('version')[0].InnerXml = $Version
+
+foreach($dependency in (Read-Xml CommonPackages.props).Project.ItemGroup.AnalyzerPackage)
+{
+ $id = $dependency.Include
+ if (-not $id) { continue }
+
+ $node = $nuspec.CreateElement('dependency')
+ $node.SetAttribute('id', $id)
+ $node.SetAttribute('version', $dependency.Version)
+
+ $dependencies.AppendChild($node)
+}
+
+$outputPath = Join-Path $projectPath Lombiq.Analyzers.nuspec
+$nuspec.Save($outputPath)
diff --git a/Invoke-BeforePack.ps1 b/Invoke-BeforePack.ps1
new file mode 100644
index 00000000..cc38cc43
--- /dev/null
+++ b/Invoke-BeforePack.ps1
@@ -0,0 +1,9 @@
+# This script tries to work around NuGet's validation caused by the presence of these files:
+# - bin/Release/netstandard2.0/Lombiq.Analyzers.dll
+# - obj/Release/netstandard2.0/Lombiq.Analyzers.dll
+# The cause is probably that we don't actually do anything in the corresponding csproj, it only exists because we need
+# an entry point for `dotnet pack` (unlike the older `nuget pack` tooling, which worked with just the .nuspec alone).
+
+# Remove all .dll and other build output files from the directory to be packed.
+Remove-Item Lombiq.Analyzers/bin -Recurse
+Remove-Item Lombiq.Analyzers/obj/Release -Recurse
diff --git a/Lombiq.Analyzers.csproj b/Lombiq.Analyzers.csproj
deleted file mode 100644
index e6131e40..00000000
--- a/Lombiq.Analyzers.csproj
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
- net6.0
- $(DefaultItemExcludes);.git*;
-
-
-
- Lombiq .NET Analyzers
- Lombiq Technologies
- Copyright © 2020, Lombiq Technologies Ltd.
- Lombiq .NET Analyzers: .NET code analyzers and code convention settings for Lombiq (https://lombiq.com) projects, predominantly for Orchard Core (https://orchardcore.net/) apps but also any .NET apps. See the project website for detailed documentation.
- NuGetIcon.png
- OrchardCore;Lombiq;AspNetCore;CodeAnalysis;DotNetAnalyzers;Analyzer;Analyzers;Diagnostic;Roslyn;Refactoring;AsyncFixer;Meziantou.Analyzer;StyleCop
- https://github.com/Lombiq/.NET-Analyzers
- https://github.com/Lombiq/.NET-Analyzers
- License.md
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Lombiq.Analyzers.sln b/Lombiq.Analyzers.sln
new file mode 100644
index 00000000..4ea0a908
--- /dev/null
+++ b/Lombiq.Analyzers.sln
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.32112.339
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lombiq.Analyzers", "Lombiq.Analyzers\Lombiq.Analyzers.csproj", "{1435B0AD-AB9A-42BA-B3D9-554FE5274CE8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {1435B0AD-AB9A-42BA-B3D9-554FE5274CE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1435B0AD-AB9A-42BA-B3D9-554FE5274CE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1435B0AD-AB9A-42BA-B3D9-554FE5274CE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1435B0AD-AB9A-42BA-B3D9-554FE5274CE8}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/.editorconfig b/Lombiq.Analyzers/.editorconfig
similarity index 99%
rename from .editorconfig
rename to Lombiq.Analyzers/.editorconfig
index 6996c6f3..1791262b 100644
--- a/.editorconfig
+++ b/Lombiq.Analyzers/.editorconfig
@@ -1,5 +1,5 @@
-# WARNING: Only edit this file in the Lombiq .NET Analyzers repository's folder. A copy of this file anywhere else will
-# be overwritten.
+# WARNING: Only edit this file in the Lombiq .NET Analyzers repository's "Lombiq.Analyzers" folder. A copy of this file
+# anywhere else will be overwritten.
# Common .NET conventions, code formatting and naming convention rules. Check out possible configs here:
# https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
diff --git a/Build.props b/Lombiq.Analyzers/Build.props
similarity index 72%
rename from Build.props
rename to Lombiq.Analyzers/Build.props
index a388df21..34021ccb 100644
--- a/Build.props
+++ b/Lombiq.Analyzers/Build.props
@@ -2,8 +2,10 @@
$(MSBuildThisFileDirectory)orchardcore.ruleset
true
-
- false
+
+ false
@@ -63,7 +65,22 @@
-
-
+
+
+
+
+
+
+
+
diff --git a/Lombiq.Analyzers/CommonPackages.props b/Lombiq.Analyzers/CommonPackages.props
new file mode 100644
index 00000000..3ba5fd2f
--- /dev/null
+++ b/Lombiq.Analyzers/CommonPackages.props
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers;
+
+
+
+
diff --git a/Docs/AddingAnalyzers.md b/Lombiq.Analyzers/Docs/AddingAnalyzers.md
similarity index 91%
rename from Docs/AddingAnalyzers.md
rename to Lombiq.Analyzers/Docs/AddingAnalyzers.md
index 778352a1..7b1d2e9c 100644
--- a/Docs/AddingAnalyzers.md
+++ b/Lombiq.Analyzers/Docs/AddingAnalyzers.md
@@ -49,9 +49,17 @@ For at least Visual Studio and JetBrains Rider you don't need any further setup
## How to add the analyzers to SDK-style projects from NuGet
-The recommended approach for SDK-style projects is adding .NET Analyzers as a submodule as explained above due to the increased control you have over configuration. However, if you aren't using Git or prefer NuGet, you can also use the [NuGet package](https://www.nuget.org/packages/Lombiq.Analyzers/) to install it for just one project. Once you add the package to your project, all analyzers will be applied.
+The recommended approach for SDK-style projects is adding .NET Analyzers as a submodule as explained above due to the increased control you have over configuration. However, if you aren't using Git, dislike submodules or prefer NuGet, you can also use the [NuGet package](https://www.nuget.org/packages/Lombiq.Analyzers/) to install it for just one project. Once you add the package to your project, all analyzers will be applied.
-You can also add the package to all projects in a folder at once from a _Directory.Build.props_ file (much like we do in [_CommonPackages.props_](../CommonPackages.props)).
+```csproj
+
+ all
+
+```
+
+The `all` is necessary to prevent the analyzers "leaking" into other projects that may consume yours.
+
+You can also add the package to all projects inside a folder at once [from a _Directory.Build.props_ file](https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build).
## How to add the analyzers to individual non-SDK-style .NET Framework projects (not solutions)
diff --git a/Docs/ConfiguringAnalyzers.md b/Lombiq.Analyzers/Docs/ConfiguringAnalyzers.md
similarity index 100%
rename from Docs/ConfiguringAnalyzers.md
rename to Lombiq.Analyzers/Docs/ConfiguringAnalyzers.md
diff --git a/Docs/UsingAnalyzersDuringCommandLineBuilds.md b/Lombiq.Analyzers/Docs/UsingAnalyzersDuringCommandLineBuilds.md
similarity index 84%
rename from Docs/UsingAnalyzersDuringCommandLineBuilds.md
rename to Lombiq.Analyzers/Docs/UsingAnalyzersDuringCommandLineBuilds.md
index 38472952..52a7255a 100644
--- a/Docs/UsingAnalyzersDuringCommandLineBuilds.md
+++ b/Lombiq.Analyzers/Docs/UsingAnalyzersDuringCommandLineBuilds.md
@@ -18,7 +18,7 @@ dotnet build MySolution.sln --no-incremental /p:TreatWarningsAsErrors=true
## .NET code style analysis
-If you want code style analysis configured in _.editorconfig_ (i.e. IDE\* rules, this is not applicable to the others) to be checked during build too (it's already checked during editing) then you'll need to run the build with `RunAnalyzersDuringBuild=true`. **Don't** enable `EnforceCodeStyleInBuild` as explained in [the docs](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview#code-style-analysis) since that'll always use the analyzers from the .NET SDK, not the explicitly referenced packages, and will cause violations not to show (see [this comment](https://github.com/dotnet/roslyn/issues/50785#issuecomment-768606882)).
+If you want code style analysis configured in _.editorconfig_ (i.e. IDE\* rules, this is not applicable to the others) to be checked during build too (it's already checked during editing) then you'll need to run the build with `RunAnalyzersDuringBuild=true`. **Don't** enable `EnforceCodeStyleInBuild` as explained in [the docs](https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview#code-style-analysis) because that always uses the analyzers from the .NET SDK, not the explicitly referenced packages, and violations won't show up (see [this comment](https://github.com/dotnet/roslyn/issues/50785#issuecomment-768606882)).
```ps
dotnet build MySolution.sln --no-incremental /p:RunAnalyzersDuringBuild=true
@@ -36,6 +36,8 @@ Or if you only want to see the errors and not the full build output (including e
dotnet build MySolution.sln --no-incremental -warnaserror /p:TreatWarningsAsErrors=true /p:RunAnalyzersDuringBuild=true -nologo -consoleLoggerParameters:NoSummary -verbosity:quiet
```
+> ⚠ If you are using the NuGet package, run `dotnet msbuild "-t:Restore;LombiqNetAnalyzers" MySolution.sln` first to ensure the _.editorconfig_ file is deployed. This is especially important for CI usage. For local development, you can simply rebuild the solution.
+
Note that code style analysis is experimental in the .NET 5 SDK and [may change in later versions](https://github.com/dotnet/roslyn/issues/49044).
## Non-SDK-style .NET Framework projects
diff --git a/Docs/UsingAnalyzersDuringDevelopment.md b/Lombiq.Analyzers/Docs/UsingAnalyzersDuringDevelopment.md
similarity index 100%
rename from Docs/UsingAnalyzersDuringDevelopment.md
rename to Lombiq.Analyzers/Docs/UsingAnalyzersDuringDevelopment.md
diff --git a/License.md b/Lombiq.Analyzers/License.md
similarity index 100%
rename from License.md
rename to Lombiq.Analyzers/License.md
diff --git a/Lombiq.Analyzers/Lombiq.Analyzers.csproj b/Lombiq.Analyzers/Lombiq.Analyzers.csproj
new file mode 100644
index 00000000..4bd3bc25
--- /dev/null
+++ b/Lombiq.Analyzers/Lombiq.Analyzers.csproj
@@ -0,0 +1,26 @@
+
+
+
+ netstandard2.0
+ $(DefaultItemExcludes);.git*;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Lombiq.Analyzers/Lombiq.Analyzers.nuspec.template b/Lombiq.Analyzers/Lombiq.Analyzers.nuspec.template
new file mode 100644
index 00000000..190367c3
--- /dev/null
+++ b/Lombiq.Analyzers/Lombiq.Analyzers.nuspec.template
@@ -0,0 +1,20 @@
+
+
+
+ Lombiq.Analyzers
+ $version$
+ Lombiq .NET Analyzers
+ Lombiq Technologies
+ License.md
+ https://aka.ms/deprecateLicenseUrl
+ NuGetIcon.png
+ https://github.com/Lombiq/.NET-Analyzers
+ Lombiq .NET Analyzers: .NET code analyzers and code convention settings for Lombiq (https://lombiq.com) projects, predominantly for Orchard Core (https://orchardcore.net/) apps but also any .NET apps. See the project website for detailed documentation.
+ Copyright © 2020, Lombiq Technologies Ltd.
+ OrchardCore Lombiq AspNetCore CodeAnalysis DotNetAnalyzers Analyzer Analyzers Diagnostic Roslyn Refactoring AsyncFixer Meziantou.Analyzer StyleCop
+
+
+
+
+
+
diff --git a/NetFx.Build.props b/Lombiq.Analyzers/NetFx.Build.props
similarity index 100%
rename from NetFx.Build.props
rename to Lombiq.Analyzers/NetFx.Build.props
diff --git a/NuGetIcon.png b/Lombiq.Analyzers/NuGetIcon.png
similarity index 100%
rename from NuGetIcon.png
rename to Lombiq.Analyzers/NuGetIcon.png
diff --git a/Readme.md b/Lombiq.Analyzers/Readme.md
similarity index 100%
rename from Readme.md
rename to Lombiq.Analyzers/Readme.md
diff --git a/SonarLint.xml b/Lombiq.Analyzers/SonarLint.xml
similarity index 100%
rename from SonarLint.xml
rename to Lombiq.Analyzers/SonarLint.xml
diff --git a/VisualStudioExtension.Build.props b/Lombiq.Analyzers/VisualStudioExtension.Build.props
similarity index 100%
rename from VisualStudioExtension.Build.props
rename to Lombiq.Analyzers/VisualStudioExtension.Build.props
diff --git a/Lombiq.Analyzers/build/Lombiq.Analyzers.props b/Lombiq.Analyzers/build/Lombiq.Analyzers.props
new file mode 100644
index 00000000..49b5725f
--- /dev/null
+++ b/Lombiq.Analyzers/build/Lombiq.Analyzers.props
@@ -0,0 +1,7 @@
+
+
+ true
+
+
+
+
diff --git a/general.ruleset b/Lombiq.Analyzers/general.ruleset
similarity index 100%
rename from general.ruleset
rename to Lombiq.Analyzers/general.ruleset
diff --git a/orchard1.ruleset b/Lombiq.Analyzers/orchard1.ruleset
similarity index 100%
rename from orchard1.ruleset
rename to Lombiq.Analyzers/orchard1.ruleset
diff --git a/orchardcore.ruleset b/Lombiq.Analyzers/orchardcore.ruleset
similarity index 100%
rename from orchardcore.ruleset
rename to Lombiq.Analyzers/orchardcore.ruleset
diff --git a/stylecop.json b/Lombiq.Analyzers/stylecop.json
similarity index 100%
rename from stylecop.json
rename to Lombiq.Analyzers/stylecop.json
diff --git a/visualstudioextension.ruleset b/Lombiq.Analyzers/visualstudioextension.ruleset
similarity index 100%
rename from visualstudioextension.ruleset
rename to Lombiq.Analyzers/visualstudioextension.ruleset
diff --git a/TestSolutions/AnalyzerViolations.cs b/TestSolutions/AnalyzerViolations.cs
new file mode 100644
index 00000000..60bcd7d8
--- /dev/null
+++ b/TestSolutions/AnalyzerViolations.cs
@@ -0,0 +1,16 @@
+namespace Lombiq.Analyzers.ProjectReference;
+
+// This file has intentional analyzer violations. Only edit the one in the TestSolutions directory. Any copy in the
+// subdirectories will be copied over during build. Copying is necessary so the source files are in a directory with an
+// existing parent .editorconfig file. (Linking will cause them to physically be outside of the .editorconfig's area of
+// effect.) Also please commit the updated version everywhere, because if the file is not present before the build
+// starts then MSBuild won't include it despite the task. For this purpose the task is only there to
+// ensure that the changes propagate and get committed.
+public class Class1
+{
+ private int Number;
+ public Class1(int number)
+ {
+ Number = number;
+ }
+}
diff --git a/TestSolutions/Directory.Build.props b/TestSolutions/Directory.Build.props
new file mode 100644
index 00000000..f028845c
--- /dev/null
+++ b/TestSolutions/Directory.Build.props
@@ -0,0 +1,9 @@
+
+
+
+
+ true
+
+
diff --git a/TestSolutions/Lombiq.Analyzers.PackageReference/IndirectPackageReference/IndirectPackageReference.csproj b/TestSolutions/Lombiq.Analyzers.PackageReference/IndirectPackageReference/IndirectPackageReference.csproj
new file mode 100644
index 00000000..9d5d6104
--- /dev/null
+++ b/TestSolutions/Lombiq.Analyzers.PackageReference/IndirectPackageReference/IndirectPackageReference.csproj
@@ -0,0 +1,32 @@
+
+
+
+ net6.0
+
+
+
+
+
+
+ all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TestSolutions/Lombiq.Analyzers.PackageReference/Lombiq.Analyzers.PackageReference.csproj b/TestSolutions/Lombiq.Analyzers.PackageReference/Lombiq.Analyzers.PackageReference.csproj
new file mode 100644
index 00000000..726d2a1c
--- /dev/null
+++ b/TestSolutions/Lombiq.Analyzers.PackageReference/Lombiq.Analyzers.PackageReference.csproj
@@ -0,0 +1,22 @@
+
+
+
+ net6.0
+
+
+
+
+ all
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TestSolutions/Lombiq.Analyzers.PackageReference/Lombiq.Analyzers.PackageReference.sln b/TestSolutions/Lombiq.Analyzers.PackageReference/Lombiq.Analyzers.PackageReference.sln
new file mode 100644
index 00000000..7a4c2b2b
--- /dev/null
+++ b/TestSolutions/Lombiq.Analyzers.PackageReference/Lombiq.Analyzers.PackageReference.sln
@@ -0,0 +1,34 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30114.105
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lombiq.Analyzers.PackageReference", "Lombiq.Analyzers.PackageReference.csproj", "{431AE877-59B7-438C-91AE-825AC847B447}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0533C5D5-F4D0-4231-A810-80E7342F9C33}"
+ ProjectSection(SolutionItems) = preProject
+ ..\Directory.Build.props = ..\Directory.Build.props
+ ..\AnalyzerViolations.cs = ..\AnalyzerViolations.cs
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IndirectPackageReference", "IndirectPackageReference\IndirectPackageReference.csproj", "{B6108F6C-7B57-4475-932A-1124CD7CBF11}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {431AE877-59B7-438C-91AE-825AC847B447}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {431AE877-59B7-438C-91AE-825AC847B447}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {431AE877-59B7-438C-91AE-825AC847B447}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {431AE877-59B7-438C-91AE-825AC847B447}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6108F6C-7B57-4475-932A-1124CD7CBF11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6108F6C-7B57-4475-932A-1124CD7CBF11}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6108F6C-7B57-4475-932A-1124CD7CBF11}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6108F6C-7B57-4475-932A-1124CD7CBF11}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/TestSolutions/Lombiq.Analyzers.ProjectReference/Lombiq.Analyzers.ProjectReference.csproj b/TestSolutions/Lombiq.Analyzers.ProjectReference/Lombiq.Analyzers.ProjectReference.csproj
new file mode 100644
index 00000000..19f387d4
--- /dev/null
+++ b/TestSolutions/Lombiq.Analyzers.ProjectReference/Lombiq.Analyzers.ProjectReference.csproj
@@ -0,0 +1,13 @@
+
+
+
+
+
+ net6.0
+
+
+
+
+
+
+
diff --git a/TestSolutions/Lombiq.Analyzers.ProjectReference/Lombiq.Analyzers.ProjectReference.sln b/TestSolutions/Lombiq.Analyzers.ProjectReference/Lombiq.Analyzers.ProjectReference.sln
new file mode 100644
index 00000000..80f6336c
--- /dev/null
+++ b/TestSolutions/Lombiq.Analyzers.ProjectReference/Lombiq.Analyzers.ProjectReference.sln
@@ -0,0 +1,33 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.30114.105
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lombiq.Analyzers.ProjectReference", "Lombiq.Analyzers.ProjectReference.csproj", "{E43F83B6-F5D0-4FD9-AD3D-2FB071B777A6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lombiq.Analyzers", "..\..\Lombiq.Analyzers\Lombiq.Analyzers.csproj", "{E4090872-11F2-49D1-A746-65E15DC4977E}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CE857933-4E64-44B8-A1CA-3489F88475AB}"
+ ProjectSection(SolutionItems) = preProject
+ ..\Directory.Build.props = ..\Directory.Build.props
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E43F83B6-F5D0-4FD9-AD3D-2FB071B777A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E43F83B6-F5D0-4FD9-AD3D-2FB071B777A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E43F83B6-F5D0-4FD9-AD3D-2FB071B777A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E43F83B6-F5D0-4FD9-AD3D-2FB071B777A6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E4090872-11F2-49D1-A746-65E15DC4977E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E4090872-11F2-49D1-A746-65E15DC4977E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E4090872-11F2-49D1-A746-65E15DC4977E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E4090872-11F2-49D1-A746-65E15DC4977E}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/build/Lombiq.Analyzers.props b/build/Lombiq.Analyzers.props
deleted file mode 100644
index 810897af..00000000
--- a/build/Lombiq.Analyzers.props
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-