Skip to content

Commit 9846fb1

Browse files
Bart KoelmanBart Koelman
authored andcommitted
Added version check due to upcoming breaking API
Visual Studio 2017 Update 3 will be incompatible with previous versions, because of breaking changes in its IOperation API.
1 parent 851c933 commit 9846fb1

File tree

44 files changed

+136
-43
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+136
-43
lines changed

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
<Compile Include="Extensions\OperationExtensions.cs" />
4848
<Compile Include="Extensions\SymbolExtensions.cs" />
4949
<Compile Include="Extensions\SyntaxNodeAnalysisContextExtensions.cs" />
50+
<Compile Include="GuidelineAnalyzer.cs" />
5051
<Compile Include="IdentifierName.cs" />
5152
<Compile Include="Extensions\TypeSymbolExtensions.cs" />
5253
<Compile Include="Guard.cs" />

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0</licenseUrl>
1010
<projectUrl>https://github.com/bkoelman/CSharpGuidelinesAnalyzer</projectUrl>
1111
<requireLicenseAcceptance>false</requireLicenseAcceptance>
12-
<description>Reports diagnostics for C# coding guidelines that are not already covered by Resharper. Requires Visual Studio 2017 or 2015 with at least Update 2.</description>
13-
<releaseNotes>First stable version; includes support for Visual Studio 2017.</releaseNotes>
12+
<description>Reports diagnostics for C# coding guidelines that are not already covered by Resharper. Works with Visual Studio 2015 Update 2 - Visual Studio 2017 Update 2.</description>
13+
<releaseNotes>Added version-based upgrade message, due to upcoming breaking changes in compiler API.</releaseNotes>
1414
<copyright>Apache License, Version 2.0</copyright>
1515
<language>en-us</language>
1616
<tags>csharp c# coding guidelines analyzer</tags>
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System;
2+
using System.Reflection;
3+
using System.Threading;
4+
using JetBrains.Annotations;
5+
using Microsoft.CodeAnalysis;
6+
using Microsoft.CodeAnalysis.Diagnostics;
7+
8+
namespace CSharpGuidelinesAnalyzer
9+
{
10+
public abstract class GuidelineAnalyzer : DiagnosticAnalyzer
11+
{
12+
[NotNull]
13+
private static readonly CompilerVersionCompatibilityValidator VersionValidator =
14+
new CompilerVersionCompatibilityValidator();
15+
16+
protected GuidelineAnalyzer()
17+
{
18+
if (!VersionValidator.IsCompatible())
19+
{
20+
throw new Exception(VersionValidator.GetMessage());
21+
}
22+
}
23+
24+
private sealed class CompilerVersionCompatibilityValidator
25+
{
26+
[NotNull]
27+
private static readonly Version MinVersion = new Version(1, 2, 0, 0);
28+
29+
[NotNull]
30+
private static readonly Version MaxVersion = new Version(2, 2, 0, 0);
31+
32+
private const string BaseMessage = "This analyzer package requires Visual Studio 2015 Update 2 - 2017 Update 2.";
33+
34+
[NotNull]
35+
private static readonly Lazy<VisualStudioVersionStatus> VersionStatusLazy;
36+
37+
static CompilerVersionCompatibilityValidator()
38+
{
39+
VersionStatusLazy = new Lazy<VisualStudioVersionStatus>(GetVersionStatus, LazyThreadSafetyMode.PublicationOnly);
40+
}
41+
42+
private static VisualStudioVersionStatus GetVersionStatus()
43+
{
44+
Version version = GetCompilerVersion();
45+
46+
return version < MinVersion
47+
? VisualStudioVersionStatus.TooLow
48+
: version > MaxVersion
49+
? VisualStudioVersionStatus.TooHigh
50+
: VisualStudioVersionStatus.Ok;
51+
}
52+
53+
[NotNull]
54+
private static Version GetCompilerVersion()
55+
{
56+
return typeof(Compilation).GetTypeInfo().Assembly.GetName().Version;
57+
}
58+
59+
public bool IsCompatible()
60+
{
61+
return VersionStatusLazy.Value == VisualStudioVersionStatus.Ok;
62+
}
63+
64+
[CanBeNull]
65+
public string GetMessage()
66+
{
67+
switch (VersionStatusLazy.Value)
68+
{
69+
case VisualStudioVersionStatus.TooLow:
70+
{
71+
return BaseMessage + " Please upgrade to a newer version of Visual Studio.";
72+
}
73+
case VisualStudioVersionStatus.TooHigh:
74+
{
75+
return BaseMessage + " Please upgrade to a newer version of CSharpGuidelinesAnalyzer.";
76+
}
77+
default:
78+
{
79+
return null;
80+
}
81+
}
82+
}
83+
84+
private enum VisualStudioVersionStatus
85+
{
86+
Ok,
87+
TooLow,
88+
TooHigh
89+
}
90+
}
91+
}
92+
}

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/ClassDesign/AvoidStaticClassesAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace CSharpGuidelinesAnalyzer.Rules.ClassDesign
1111
{
1212
[DiagnosticAnalyzer(LanguageNames.CSharp)]
13-
public sealed class AvoidStaticClassesAnalyzer : DiagnosticAnalyzer
13+
public sealed class AvoidStaticClassesAnalyzer : GuidelineAnalyzer
1414
{
1515
public const string DiagnosticId = "AV1008";
1616

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/ClassDesign/DoNotHideInheritedMembersAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace CSharpGuidelinesAnalyzer.Rules.ClassDesign
88
{
99
[DiagnosticAnalyzer(LanguageNames.CSharp)]
10-
public sealed class DoNotHideInheritedMembersAnalyzer : DiagnosticAnalyzer
10+
public sealed class DoNotHideInheritedMembersAnalyzer : GuidelineAnalyzer
1111
{
1212
public const string DiagnosticId = "AV1010";
1313

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/ClassDesign/MembersShouldDoASingleThingAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace CSharpGuidelinesAnalyzer.Rules.ClassDesign
99
{
1010
[DiagnosticAnalyzer(LanguageNames.CSharp)]
11-
public sealed class MembersShouldDoASingleThingAnalyzer : DiagnosticAnalyzer
11+
public sealed class MembersShouldDoASingleThingAnalyzer : GuidelineAnalyzer
1212
{
1313
public const string DiagnosticId = "AV1115";
1414

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/ClassDesign/TypesShouldHaveASinglePurposeAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace CSharpGuidelinesAnalyzer.Rules.ClassDesign
99
{
1010
[DiagnosticAnalyzer(LanguageNames.CSharp)]
11-
public sealed class TypesShouldHaveASinglePurposeAnalyzer : DiagnosticAnalyzer
11+
public sealed class TypesShouldHaveASinglePurposeAnalyzer : GuidelineAnalyzer
1212
{
1313
public const string DiagnosticId = "AV1000";
1414

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Documentation/AvoidInlineCommentsAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace CSharpGuidelinesAnalyzer.Rules.Documentation
99
{
1010
[DiagnosticAnalyzer(LanguageNames.CSharp)]
11-
public sealed class AvoidInlineCommentsAnalyzer : DiagnosticAnalyzer
11+
public sealed class AvoidInlineCommentsAnalyzer : GuidelineAnalyzer
1212
{
1313
public const string DiagnosticId = "AV2310";
1414

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Documentation/AvoidToDoCommentsAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace CSharpGuidelinesAnalyzer.Rules.Documentation
1010
{
1111
[DiagnosticAnalyzer(LanguageNames.CSharp)]
12-
public sealed class AvoidToDoCommentsAnalyzer : DiagnosticAnalyzer
12+
public sealed class AvoidToDoCommentsAnalyzer : GuidelineAnalyzer
1313
{
1414
public const string DiagnosticId = "AV2318";
1515

src/CSharpGuidelinesAnalyzer/CSharpGuidelinesAnalyzer/Rules/Documentation/DocumentAllInternalMembersAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
namespace CSharpGuidelinesAnalyzer.Rules.Documentation
1212
{
1313
[DiagnosticAnalyzer(LanguageNames.CSharp)]
14-
public sealed class DocumentAllInternalMembersAnalyzer : DiagnosticAnalyzer
14+
public sealed class DocumentAllInternalMembersAnalyzer : GuidelineAnalyzer
1515
{
1616
public const string DiagnosticId = "AV2305";
1717

0 commit comments

Comments
 (0)