Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable nullable reference types for the repo #3021

Merged
merged 30 commits into from Nov 26, 2019
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e29e3a1
Enable nullable on repo
mavasani Nov 7, 2019
a5b448a
Annotate Utilities with nullable annotation
mavasani Nov 7, 2019
b424db6
Restrict nullable enable to only shipping projects for now.
mavasani Nov 7, 2019
6398f5f
Nullable annotations in Metrics project
mavasani Nov 7, 2019
05bdcfa
Nullable annotations for Roslyn.Diagnostics.Analyzers
mavasani Nov 7, 2019
abecfb2
Nullable annotations for Microsoft.CodeAnalysis.Analyzers
mavasani Nov 7, 2019
73aaa1b
Nullable annotations for BannedApiAnalyzers
mavasani Nov 7, 2019
bb439cb
Nullable annotations for PublicApiAnalyzers
mavasani Nov 7, 2019
6f36f66
Disable nullable for MetaCompilation.Analyzers
mavasani Nov 7, 2019
e1afae9
Nullable annotations for PerformanceSensitiveAnalyzers
mavasani Nov 7, 2019
669b773
Nullable annotation for internal flow analysis utilties
mavasani Nov 7, 2019
1c344c2
Nullable annotations for Microsoft.CodeQuality.Analyzers
mavasani Nov 7, 2019
a2531f3
Some more nullable annotations for utilities
mavasani Nov 7, 2019
9090966
Additional nullable annotations to a code quality analyzer
mavasani Nov 7, 2019
2404ec0
Add nullable annotations for Microsoft.NetCore.Analyzers
mavasani Nov 7, 2019
28efa04
Add nullable annotations for ReleaseNotesUtil
mavasani Nov 8, 2019
de1b692
Add nullable annotations for GenerateAnalyzerRulesets
mavasani Nov 8, 2019
3591255
Fix a unit test failure from incorrect refactoring
mavasani Nov 8, 2019
404f9cc
Disable nullable in TestReferenceAssembly
mavasani Nov 8, 2019
c72761d
Add nullable annotations for Microsoft.NetFramework.Analyzers
mavasani Nov 8, 2019
64aa452
Add some more missing nullable annotations found after building the e…
mavasani Nov 8, 2019
614dde0
Address feedback for symbol extensions
mavasani Nov 8, 2019
b5b948d
Address feedback
mavasani Nov 8, 2019
4fdc7cc
Minor fix
mavasani Nov 8, 2019
a645fc3
Fix unit tests
mavasani Nov 8, 2019
9c1ee5b
Address feedback from Sam
mavasani Nov 16, 2019
0339d37
Merge remote-tracking branch 'upstream/2.9.x' into NullableReferenceT…
mavasani Nov 16, 2019
533b93e
Some more fixes
mavasani Nov 16, 2019
099e504
Merge remote-tracking branch 'upstream/2.9.x' into NullableReferenceT…
mavasani Nov 25, 2019
cbe55d1
Add nullable annotations after merging latest
mavasani Nov 25, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions Directory.Build.props
Expand Up @@ -11,6 +11,9 @@
<PropertyGroup>
<LangVersion Condition="'$(Language)' == 'C#'">8</LangVersion>
<LangVersion Condition="'$(Language)' == 'VB'">16</LangVersion>

<!-- TODO: Enable Nullable for test and non-shipping projects -->
<Nullable Condition="'$(Nullable)' == '' and '$(IsTestProject)' != 'true' and '$(NonShipping)' != 'true'">enable</Nullable>
</PropertyGroup>

<PropertyGroup>
Expand Down
2 changes: 2 additions & 0 deletions src/MetaCompilation.Analyzers/Core/CodeFixProvider.cs
@@ -1,5 +1,7 @@
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#nullable disable

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
Expand Down
2 changes: 2 additions & 0 deletions src/MetaCompilation.Analyzers/Core/DiagnosticAnalyzer.cs
@@ -1,5 +1,7 @@
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#nullable disable

using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
Expand Down
Expand Up @@ -50,15 +50,15 @@ public override void Initialize(AnalysisContext context)

context.RegisterCompilationStartAction(compilationContext =>
{
INamedTypeSymbol solutionSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(SolutionFullName);
INamedTypeSymbol projectSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(ProjectFullName);
INamedTypeSymbol documentSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(DocumentFullName);
INamedTypeSymbol syntaxNodeSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(SyntaxNodeFullName);
INamedTypeSymbol compilationSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(CompilationFullName);
INamedTypeSymbol? solutionSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(SolutionFullName);
INamedTypeSymbol? projectSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(ProjectFullName);
INamedTypeSymbol? documentSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(DocumentFullName);
INamedTypeSymbol? syntaxNodeSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(SyntaxNodeFullName);
INamedTypeSymbol? compilationSymbol = compilationContext.Compilation.GetOrCreateTypeByMetadataName(CompilationFullName);
mavasani marked this conversation as resolved.
Show resolved Hide resolved

ImmutableArray<INamedTypeSymbol> immutableSymbols = ImmutableArray.Create(solutionSymbol, projectSymbol, documentSymbol, syntaxNodeSymbol, compilationSymbol);
ImmutableArray<INamedTypeSymbol> immutableSymbols = ImmutableArray.CreateRange(new[] { solutionSymbol, projectSymbol, documentSymbol, syntaxNodeSymbol, compilationSymbol }.WhereNotNull());
//Only register our node action if we can find the symbols for our immutable types
if (immutableSymbols.Any(n => n == null))
if (immutableSymbols.IsEmpty)
{
return;
}
Expand Down
Expand Up @@ -23,19 +23,19 @@ public class CSharpRegisterActionAnalyzer : RegisterActionAnalyzer<ClassDeclarat
INamedTypeSymbol operationBlockStartAnalysisContext,
INamedTypeSymbol symbolKind)
{
INamedTypeSymbol csharpSyntaxKind = compilation.GetOrCreateTypeByMetadataName(CSharpSyntaxKindName);
INamedTypeSymbol basicSyntaxKind = compilation.GetOrCreateTypeByMetadataName(BasicSyntaxKindName);
INamedTypeSymbol? csharpSyntaxKind = compilation.GetOrCreateTypeByMetadataName(CSharpSyntaxKindName);
INamedTypeSymbol? basicSyntaxKind = compilation.GetOrCreateTypeByMetadataName(BasicSyntaxKindName);
return new CSharpRegisterActionCodeBlockAnalyzer(csharpSyntaxKind, basicSyntaxKind, analysisContext, compilationStartAnalysisContext,
codeBlockStartAnalysisContext, operationBlockStartAnalysisContext, symbolKind);
}

private sealed class CSharpRegisterActionCodeBlockAnalyzer : RegisterActionCodeBlockAnalyzer
{
private readonly ITypeSymbol _csharpSyntaxKind, _basicSyntaxKind;
private readonly ITypeSymbol? _csharpSyntaxKind, _basicSyntaxKind;

public CSharpRegisterActionCodeBlockAnalyzer(
INamedTypeSymbol csharpSyntaxKind,
INamedTypeSymbol basicSyntaxKind,
INamedTypeSymbol? csharpSyntaxKind,
INamedTypeSymbol? basicSyntaxKind,
INamedTypeSymbol analysisContext,
INamedTypeSymbol compilationStartAnalysisContext,
INamedTypeSymbol codeBlockStartAnalysisContext,
Expand All @@ -51,7 +51,7 @@ private sealed class CSharpRegisterActionCodeBlockAnalyzer : RegisterActionCodeB
protected override SyntaxKind ArgumentSyntaxKind => SyntaxKind.Argument;
protected override SyntaxKind ParameterSyntaxKind => SyntaxKind.Parameter;

protected override IEnumerable<SyntaxNode> GetArgumentExpressions(InvocationExpressionSyntax invocation)
protected override IEnumerable<SyntaxNode>? GetArgumentExpressions(InvocationExpressionSyntax invocation)
{
if (invocation.ArgumentList != null)
{
Expand All @@ -71,7 +71,7 @@ protected override SyntaxNode GetInvocationExpression(InvocationExpressionSyntax
return invocation.Expression;
}

protected override SyntaxNode GetInvocationReceiver(InvocationExpressionSyntax invocation)
protected override SyntaxNode? GetInvocationReceiver(InvocationExpressionSyntax invocation)
{
return (invocation.Expression as MemberAccessExpressionSyntax)?.Expression;
}
Expand Down
Expand Up @@ -24,7 +24,7 @@ public CSharpReportDiagnosticCompilationAnalyzer(ImmutableHashSet<INamedTypeSymb
{
}

protected override IEnumerable<SyntaxNode> GetArgumentExpressions(InvocationExpressionSyntax invocation)
protected override IEnumerable<SyntaxNode>? GetArgumentExpressions(InvocationExpressionSyntax invocation)
{
if (invocation.ArgumentList != null)
{
Expand Down
Expand Up @@ -55,8 +55,13 @@ private static async Task<Document> AddMethodAsync(Document document, SyntaxNode
var model = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
var typeIsSealed = ((INamedTypeSymbol)model.GetDeclaredSymbol(classDecl)).IsSealed;

INamedTypeSymbol codeFixProviderSymbol = model.Compilation.GetOrCreateTypeByMetadataName(FixerWithFixAllAnalyzer.CodeFixProviderMetadataName);
IMethodSymbol getFixAllProviderMethod = codeFixProviderSymbol.GetMembers(FixerWithFixAllAnalyzer.GetFixAllProviderMethodName).OfType<IMethodSymbol>().First();
INamedTypeSymbol? codeFixProviderSymbol = model.Compilation.GetOrCreateTypeByMetadataName(FixerWithFixAllAnalyzer.CodeFixProviderMetadataName);
IMethodSymbol? getFixAllProviderMethod = codeFixProviderSymbol?.GetMembers(FixerWithFixAllAnalyzer.GetFixAllProviderMethodName).OfType<IMethodSymbol>().FirstOrDefault();
if (getFixAllProviderMethod == null)
{
return document;
}

var returnStatement = generator.ReturnStatement(generator.MemberAccessExpression(
generator.IdentifierName("WellKnownFixAllProviders"), "BatchFixer"));
var statements = new SyntaxNode[] { returnStatement };
Expand Down
Expand Up @@ -86,37 +86,33 @@ private void CreateAnalyzerWithinCompilation(CompilationStartAnalysisContext con
{
context.CancellationToken.ThrowIfCancellationRequested();

INamedTypeSymbol codeFixProviderSymbol = context.Compilation.GetOrCreateTypeByMetadataName(CodeFixProviderMetadataName);
INamedTypeSymbol? codeFixProviderSymbol = context.Compilation.GetOrCreateTypeByMetadataName(CodeFixProviderMetadataName);
if (codeFixProviderSymbol == null)
{
return;
}

IMethodSymbol getFixAllProviderMethod = codeFixProviderSymbol.GetMembers(GetFixAllProviderMethodName).OfType<IMethodSymbol>().FirstOrDefault();
IMethodSymbol? getFixAllProviderMethod = codeFixProviderSymbol.GetMembers(GetFixAllProviderMethodName).OfType<IMethodSymbol>().FirstOrDefault();
if (getFixAllProviderMethod == null)
{
return;
}

INamedTypeSymbol codeActionSymbol = context.Compilation.GetOrCreateTypeByMetadataName(CodeActionMetadataName);
INamedTypeSymbol? codeActionSymbol = context.Compilation.GetOrCreateTypeByMetadataName(CodeActionMetadataName);
if (codeActionSymbol == null)
{
return;
}

IEnumerable<IMethodSymbol> createSymbols = codeActionSymbol.GetMembers(CreateMethodName).OfType<IMethodSymbol>();
if (createSymbols == null)
{
return;
}

IPropertySymbol equivalenceKeyProperty = codeActionSymbol.GetMembers(EquivalenceKeyPropertyName).OfType<IPropertySymbol>().FirstOrDefault();
IPropertySymbol? equivalenceKeyProperty = codeActionSymbol.GetMembers(EquivalenceKeyPropertyName).OfType<IPropertySymbol>().FirstOrDefault();
if (equivalenceKeyProperty == null)
{
return;
}

CompilationAnalyzer compilationAnalyzer = new CompilationAnalyzer(codeFixProviderSymbol, codeActionSymbol, context.Compilation.Assembly, createMethods: ImmutableHashSet.CreateRange(createSymbols));
var createMethods = codeActionSymbol.GetMembers(CreateMethodName).OfType<IMethodSymbol>().ToImmutableHashSet();

CompilationAnalyzer compilationAnalyzer = new CompilationAnalyzer(codeFixProviderSymbol, codeActionSymbol, context.Compilation.Assembly, createMethods);

context.RegisterSymbolAction(compilationAnalyzer.AnalyzeNamedTypeSymbol, SymbolKind.NamedType);
context.RegisterOperationBlockStartAction(compilationAnalyzer.OperationBlockStart);
Expand Down
Expand Up @@ -39,7 +39,7 @@ public override void Initialize(AnalysisContext context)
}

[SuppressMessage("AnalyzerPerformance", "RS1012:Start action has no registered actions.", Justification = "Method returns an analyzer that is registered by the caller.")]
protected override DiagnosticAnalyzerSymbolAnalyzer GetDiagnosticAnalyzerSymbolAnalyzer(CompilationStartAnalysisContext compilationContext, INamedTypeSymbol diagnosticAnalyzer, INamedTypeSymbol diagnosticAnalyzerAttribute)
protected override DiagnosticAnalyzerSymbolAnalyzer? GetDiagnosticAnalyzerSymbolAnalyzer(CompilationStartAnalysisContext compilationContext, INamedTypeSymbol diagnosticAnalyzer, INamedTypeSymbol diagnosticAnalyzerAttribute)
{
var compilation = compilationContext.Compilation;

Expand All @@ -62,7 +62,7 @@ protected override DiagnosticAnalyzerSymbolAnalyzer GetDiagnosticAnalyzerSymbolA
return;
}

IParameterSymbol analysisContextParameter = null;
IParameterSymbol? analysisContextParameter = null;
foreach (var parameter in method.Parameters)
{
if (!Equals(parameter.Type, analysisContext))
Expand Down
Expand Up @@ -63,7 +63,7 @@ public override void Initialize(AnalysisContext context)
return;
}

INamedTypeSymbol diagnosticAnalyzer = compilationStartContext.Compilation.GetOrCreateTypeByMetadataName(DiagnosticAnalyzerCorrectnessAnalyzer.DiagnosticAnalyzerTypeFullName);
INamedTypeSymbol? diagnosticAnalyzer = compilationStartContext.Compilation.GetOrCreateTypeByMetadataName(DiagnosticAnalyzerCorrectnessAnalyzer.DiagnosticAnalyzerTypeFullName);
if (diagnosticAnalyzer == null)
{
// Does not contain any diagnostic analyzers.
Expand Down
Expand Up @@ -63,9 +63,9 @@ private sealed class AttributeAnalyzer : DiagnosticAnalyzerSymbolAnalyzer
private const string CSharpCompilationFullName = @"Microsoft.CodeAnalysis.CSharp.CSharpCompilation";
private const string BasicCompilationFullName = @"Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation";

private readonly INamedTypeSymbol _attributeUsageAttribute;
private readonly INamedTypeSymbol? _attributeUsageAttribute;

public AttributeAnalyzer(INamedTypeSymbol diagnosticAnalyzer, INamedTypeSymbol diagnosticAnalyzerAttribute, INamedTypeSymbol attributeUsageAttribute)
public AttributeAnalyzer(INamedTypeSymbol diagnosticAnalyzer, INamedTypeSymbol diagnosticAnalyzerAttribute, INamedTypeSymbol? attributeUsageAttribute)
: base(diagnosticAnalyzer, diagnosticAnalyzerAttribute)
{
_attributeUsageAttribute = attributeUsageAttribute;
Expand All @@ -83,7 +83,7 @@ protected override void AnalyzeDiagnosticAnalyzer(SymbolAnalysisContext symbolCo
// 2) AddLanguageSupportToAnalyzerRule: For analyzer supporting only one of C# or VB languages, detect if it can support the other language.

var hasAttribute = false;
SyntaxNode attributeSyntax = null;
SyntaxNode? attributeSyntax = null;
bool supportsCSharp = false;
bool supportsVB = false;

Expand Down Expand Up @@ -133,11 +133,11 @@ protected override void AnalyzeDiagnosticAnalyzer(SymbolAnalysisContext symbolCo
// then the analyzer is pretty likely a language-agnostic analyzer.
Compilation compilation = symbolContext.Compilation;
string compilationTypeNameToCheck = supportsCSharp ? CSharpCompilationFullName : BasicCompilationFullName;
INamedTypeSymbol compilationType = compilation.GetOrCreateTypeByMetadataName(compilationTypeNameToCheck);
INamedTypeSymbol? compilationType = compilation.GetOrCreateTypeByMetadataName(compilationTypeNameToCheck);
if (compilationType == null)
{
string missingLanguage = supportsCSharp ? LanguageNames.VisualBasic : LanguageNames.CSharp;
Diagnostic diagnostic = Diagnostic.Create(AddLanguageSupportToAnalyzerRule, attributeSyntax.GetLocation(), namedType.Name, missingLanguage);
Diagnostic diagnostic = Diagnostic.Create(AddLanguageSupportToAnalyzerRule, attributeSyntax!.GetLocation(), namedType.Name, missingLanguage);
mavasani marked this conversation as resolved.
Show resolved Hide resolved
symbolContext.ReportDiagnostic(diagnostic);
}
}
Expand Down
Expand Up @@ -35,7 +35,7 @@ internal void AnalyzeSymbol(SymbolAnalysisContext symbolContext)

protected abstract void AnalyzeDiagnosticAnalyzer(SymbolAnalysisContext symbolContext);

protected bool HasDiagnosticAnalyzerAttribute(INamedTypeSymbol namedType, INamedTypeSymbol attributeUsageAttribute)
protected bool HasDiagnosticAnalyzerAttribute(INamedTypeSymbol namedType, INamedTypeSymbol? attributeUsageAttribute)
{
foreach (AttributeData attribute in namedType.GetApplicableAttributes(attributeUsageAttribute))
{
Expand Down
Expand Up @@ -54,23 +54,23 @@ public override void Initialize(AnalysisContext context)

context.RegisterCompilationStartAction(compilationContext =>
{
INamedTypeSymbol diagnosticAnalyzer = compilationContext.Compilation.GetOrCreateTypeByMetadataName(DiagnosticAnalyzerTypeFullName);
INamedTypeSymbol diagnosticAnalyzerAttribute = compilationContext.Compilation.GetOrCreateTypeByMetadataName(DiagnosticAnalyzerAttributeFullName);
INamedTypeSymbol? diagnosticAnalyzer = compilationContext.Compilation.GetOrCreateTypeByMetadataName(DiagnosticAnalyzerTypeFullName);
INamedTypeSymbol? diagnosticAnalyzerAttribute = compilationContext.Compilation.GetOrCreateTypeByMetadataName(DiagnosticAnalyzerAttributeFullName);

if (diagnosticAnalyzer == null || diagnosticAnalyzerAttribute == null)
{
// We don't need to check assemblies unless they're referencing Microsoft.CodeAnalysis which defines DiagnosticAnalyzer.
return;
}

DiagnosticAnalyzerSymbolAnalyzer analyzer = GetDiagnosticAnalyzerSymbolAnalyzer(compilationContext, diagnosticAnalyzer, diagnosticAnalyzerAttribute);
DiagnosticAnalyzerSymbolAnalyzer? analyzer = GetDiagnosticAnalyzerSymbolAnalyzer(compilationContext, diagnosticAnalyzer, diagnosticAnalyzerAttribute);
if (analyzer != null)
{
compilationContext.RegisterSymbolAction(c => analyzer.AnalyzeSymbol(c), SymbolKind.NamedType);
}
});
}

protected abstract DiagnosticAnalyzerSymbolAnalyzer GetDiagnosticAnalyzerSymbolAnalyzer(CompilationStartAnalysisContext compilationContext, INamedTypeSymbol diagnosticAnalyzer, INamedTypeSymbol diagnosticAnalyzerAttribute);
protected abstract DiagnosticAnalyzerSymbolAnalyzer? GetDiagnosticAnalyzerSymbolAnalyzer(CompilationStartAnalysisContext compilationContext, INamedTypeSymbol diagnosticAnalyzer, INamedTypeSymbol diagnosticAnalyzerAttribute);
}
}