Fix more null refs in Api Analyzers (#10375)

*  Fix more null refs in Api Analyzers

 * Make attributes used by analyzer public
 * Compile analyzer tests against ref assemblies
 * Turn on Nullable reference types and harden some null-checks

Fixes https://github.com/aspnet/AspNetCore/issues/8686
This commit is contained in:
Pranav K 2019-05-21 16:17:15 -07:00 committed by GitHub
parent e925df6a85
commit 26b53236b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 486 additions and 167 deletions

View File

@ -1,7 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
@ -122,7 +121,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
}
}
private static AttributeData GetAttribute(ISymbol symbol, INamedTypeSymbol attributeType)
private static AttributeData? GetAttribute(ISymbol symbol, INamedTypeSymbol attributeType)
{
foreach (var attribute in symbol.GetAttributes())
{

View File

@ -31,9 +31,10 @@ namespace Microsoft.CodeAnalysis
Debug.Assert(methodSymbol != null);
Debug.Assert(attribute != null);
while (methodSymbol != null)
IMethodSymbol? current = methodSymbol;
while (current != null)
{
foreach (var attributeData in GetAttributes(methodSymbol, attribute))
foreach (var attributeData in GetAttributes(current, attribute))
{
yield return attributeData;
}
@ -43,7 +44,7 @@ namespace Microsoft.CodeAnalysis
break;
}
methodSymbol = methodSymbol.IsOverride ? methodSymbol.OverriddenMethod : null;
current = current.IsOverride ? current.OverriddenMethod : null;
}
}
@ -76,14 +77,15 @@ namespace Microsoft.CodeAnalysis
return HasAttribute(propertySymbol, attribute);
}
while (propertySymbol != null)
IPropertySymbol? current = propertySymbol;
while (current != null)
{
if (propertySymbol.HasAttribute(attribute))
if (current.HasAttribute(attribute))
{
return true;
}
propertySymbol = propertySymbol.IsOverride ? propertySymbol.OverriddenProperty : null;
current = current.IsOverride ? current.OverriddenProperty : null;
}
return false;

View File

@ -9,6 +9,8 @@
<IncludeBuildOutput>false</IncludeBuildOutput>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
<NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
<NullableContextOptions>enable</NullableContextOptions>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>

View File

@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
@ -24,8 +23,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
context.RegisterCompilationStartAction(compilationStartAnalysisContext =>
{
var typeCache = new SymbolCache(compilationStartAnalysisContext.Compilation);
if (typeCache.ControllerAttribute == null || typeCache.ControllerAttribute.TypeKind == TypeKind.Error)
if (!SymbolCache.TryCreate(compilationStartAnalysisContext.Compilation, out var typeCache))
{
// No-op if we can't find types we care about.
return;
@ -185,20 +183,100 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
internal readonly struct SymbolCache
{
public SymbolCache(Compilation compilation)
public SymbolCache(
INamedTypeSymbol bindAttribute,
INamedTypeSymbol controllerAttribute,
INamedTypeSymbol fromBodyAttribute,
INamedTypeSymbol apiBehaviorMetadata,
INamedTypeSymbol binderTypeProviderMetadata,
INamedTypeSymbol modelNameProvider,
INamedTypeSymbol nonControllerAttribute,
INamedTypeSymbol nonActionAttribute,
IMethodSymbol disposableDispose)
{
BindAttribute = compilation.GetTypeByMetadataName(SymbolNames.BindAttribute);
ControllerAttribute = compilation.GetTypeByMetadataName(SymbolNames.ControllerAttribute);
FromBodyAttribute = compilation.GetTypeByMetadataName(SymbolNames.FromBodyAttribute);
IApiBehaviorMetadata = compilation.GetTypeByMetadataName(SymbolNames.IApiBehaviorMetadata);
IBinderTypeProviderMetadata = compilation.GetTypeByMetadataName(SymbolNames.IBinderTypeProviderMetadata);
IModelNameProvider = compilation.GetTypeByMetadataName(SymbolNames.IModelNameProvider);
NonControllerAttribute = compilation.GetTypeByMetadataName(SymbolNames.NonControllerAttribute);
NonActionAttribute = compilation.GetTypeByMetadataName(SymbolNames.NonActionAttribute);
BindAttribute = bindAttribute;
ControllerAttribute = controllerAttribute;
FromBodyAttribute = fromBodyAttribute;
IApiBehaviorMetadata = apiBehaviorMetadata;
IBinderTypeProviderMetadata = binderTypeProviderMetadata;
IModelNameProvider = modelNameProvider;
NonControllerAttribute = nonControllerAttribute;
NonActionAttribute = nonActionAttribute;
IDisposableDispose = disposableDispose;
}
public static bool TryCreate(Compilation compilation, out SymbolCache symbolCache)
{
symbolCache = default;
if (!TryGetType(SymbolNames.BindAttribute, out var bindAttribute))
{
return false;
}
if (!TryGetType(SymbolNames.ControllerAttribute, out var controllerAttribute))
{
return false;
}
if (!TryGetType(SymbolNames.FromBodyAttribute, out var fromBodyAttribute))
{
return false;
}
if (!TryGetType(SymbolNames.IApiBehaviorMetadata, out var apiBehaviorMetadata))
{
return false;
}
if (!TryGetType(SymbolNames.IBinderTypeProviderMetadata, out var iBinderTypeProviderMetadata))
{
return false;
}
if (!TryGetType(SymbolNames.IModelNameProvider, out var iModelNameProvider))
{
return false;
}
if (!TryGetType(SymbolNames.NonControllerAttribute, out var nonControllerAttribute))
{
return false;
}
if (!TryGetType(SymbolNames.NonActionAttribute, out var nonActionAttribute))
{
return false;
}
var disposable = compilation.GetSpecialType(SpecialType.System_IDisposable);
var members = disposable.GetMembers(nameof(IDisposable.Dispose));
IDisposableDispose = members.Length == 1 ? (IMethodSymbol)members[0] : null;
var members = disposable?.GetMembers(nameof(IDisposable.Dispose));
var idisposableDispose = (IMethodSymbol?)members?[0];
if (idisposableDispose == null)
{
return false;
}
symbolCache = new SymbolCache(
bindAttribute,
controllerAttribute,
fromBodyAttribute,
apiBehaviorMetadata,
iBinderTypeProviderMetadata,
iModelNameProvider,
nonControllerAttribute,
nonActionAttribute,
idisposableDispose);
return true;
bool TryGetType(string typeName, out INamedTypeSymbol typeSymbol)
{
typeSymbol = compilation.GetTypeByMetadataName(typeName);
return typeSymbol != null && typeSymbol.TypeKind != TypeKind.Error;
}
}
public INamedTypeSymbol BindAttribute { get; }

View File

@ -21,7 +21,7 @@
<ItemGroup>
<ProjectReference Include="..\..\Mvc.Analyzers\src\Microsoft.AspNetCore.Mvc.Analyzers.csproj" />
<Reference Include="Microsoft.AspNetCore.Mvc" />
<ProjectReference Include="..\..\Mvc\ref\Microsoft.AspNetCore.Mvc.csproj" />
<Reference Include="Microsoft.AspNetCore.Analyzer.Testing" />
<Reference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" />
</ItemGroup>

View File

@ -134,7 +134,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
var method = (IMethodSymbol)modelType.GetMembers("ActionMethod").First();
var parameter = method.Parameters[0];
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var result = TopLevelParameterNameAnalyzer.IsProblematicParameter(symbolCache, parameter);
return result;
@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
{
var methodName = nameof(GetNameTests.SingleAttribute);
var compilation = await GetCompilationForGetName();
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(GetNameTests).FullName);
var method = (IMethodSymbol)type.GetMembers(methodName).First();
@ -161,7 +161,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
{
var methodName = nameof(GetNameTests.NoAttribute);
var compilation = await GetCompilationForGetName();
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(GetNameTests).FullName);
var method = (IMethodSymbol)type.GetMembers(methodName).First();
@ -177,7 +177,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
{
var methodName = nameof(GetNameTests.SingleAttributeWithoutName);
var compilation = await GetCompilationForGetName();
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(GetNameTests).FullName);
var method = (IMethodSymbol)type.GetMembers(methodName).First();
@ -193,7 +193,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
{
var methodName = nameof(GetNameTests.MultipleAttributes);
var compilation = await GetCompilationForGetName();
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(GetNameTests).FullName);
var method = (IMethodSymbol)type.GetMembers(methodName).First();
@ -221,7 +221,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
var project = DiagnosticProject.Create(GetType().Assembly, new[] { testSource.Source });
var compilation = await project.GetCompilationAsync();
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(SpecifiesModelTypeTests).FullName);
var method = (IMethodSymbol)type.GetMembers(testMethod).First();
@ -239,7 +239,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
var project = DiagnosticProject.Create(GetType().Assembly, new[] { testSource.Source });
var compilation = await project.GetCompilationAsync();
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(SpecifiesModelTypeTests).FullName);
var method = (IMethodSymbol)type.GetMembers(testMethod).First();
@ -257,7 +257,7 @@ namespace Microsoft.AspNetCore.Mvc.Analyzers
var project = DiagnosticProject.Create(GetType().Assembly, new[] { testSource.Source });
var compilation = await project.GetCompilationAsync();
var symbolCache = new TopLevelParameterNameAnalyzer.SymbolCache(compilation);
Assert.True(TopLevelParameterNameAnalyzer.SymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(SpecifiesModelTypeTests).FullName);
var method = (IMethodSymbol)type.GetMembers(testMethod).First();

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
@ -17,7 +18,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
_statusCode = null;
}
public ActualApiResponseMetadata(ReturnStatementSyntax returnStatement, int statusCode, ITypeSymbol returnType)
public ActualApiResponseMetadata(ReturnStatementSyntax returnStatement, int statusCode, ITypeSymbol? returnType)
{
ReturnStatement = returnStatement;
_statusCode = statusCode;
@ -26,10 +27,10 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
public ReturnStatementSyntax ReturnStatement { get; }
public int StatusCode => _statusCode.Value;
public int StatusCode => _statusCode ?? throw new ArgumentException("Status code is not available when IsDefaultResponse is true");
public bool IsDefaultResponse => _statusCode == null;
public ITypeSymbol ReturnType { get; }
public ITypeSymbol? ReturnType { get; }
}
}

View File

@ -87,13 +87,13 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
.FirstOrDefault();
var statusCode = GetDefaultStatusCode(defaultStatusCodeAttribute);
ITypeSymbol returnType = null;
ITypeSymbol? returnType = null;
switch (returnExpression)
{
case InvocationExpressionSyntax invocation:
{
// Covers the 'return StatusCode(200)' case.
var result = InspectMethodArguments(symbolCache, semanticModel, invocation.Expression, invocation.ArgumentList, cancellationToken);
var result = InspectMethodArguments(semanticModel, invocation.Expression, invocation.ArgumentList, cancellationToken);
statusCode = result.statusCode ?? statusCode;
returnType = result.returnType;
break;
@ -102,7 +102,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
case ObjectCreationExpressionSyntax creation:
{
// Read values from 'return new StatusCodeResult(200) case.
var result = InspectMethodArguments(symbolCache, semanticModel, creation, creation.ArgumentList, cancellationToken);
var result = InspectMethodArguments(semanticModel, creation, creation.ArgumentList, cancellationToken);
statusCode = result.statusCode ?? statusCode;
returnType = result.returnType;
@ -123,14 +123,14 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
return new ActualApiResponseMetadata(returnStatementSyntax, statusCode.Value, returnType);
}
private static (int? statusCode, ITypeSymbol returnType) InspectInitializers(
private static (int? statusCode, ITypeSymbol? returnType) InspectInitializers(
in ApiControllerSymbolCache symbolCache,
SemanticModel semanticModel,
InitializerExpressionSyntax initializer,
CancellationToken cancellationToken)
{
int? statusCode = null;
ITypeSymbol typeSymbol = null;
ITypeSymbol? typeSymbol = null;
for (var i = 0; initializer != null && i < initializer.Expressions.Count; i++)
{
@ -162,15 +162,14 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
return (statusCode, typeSymbol);
}
private static (int? statusCode, ITypeSymbol returnType) InspectMethodArguments(
in ApiControllerSymbolCache symbolCache,
private static (int? statusCode, ITypeSymbol? returnType) InspectMethodArguments(
SemanticModel semanticModel,
ExpressionSyntax expression,
BaseArgumentListSyntax argumentList,
CancellationToken cancellationToken)
{
int? statusCode = null;
ITypeSymbol typeSymbol = null;
ITypeSymbol? typeSymbol = null;
var symbolInfo = semanticModel.GetSymbolInfo(expression, cancellationToken);

View File

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@ -43,7 +44,14 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
protected override async Task<Document> GetChangedDocumentAsync(CancellationToken cancellationToken)
{
var context = await CreateCodeActionContext(cancellationToken).ConfigureAwait(false);
var nullableContext = await CreateCodeActionContext(cancellationToken).ConfigureAwait(false);
if (nullableContext == null)
{
return _document;
}
var context = nullableContext.Value;
var declaredResponseMetadata = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(context.SymbolCache, context.Method);
var errorResponseType = SymbolApiResponseMetadataProvider.GetErrorResponseType(context.SymbolCache, context.Method);
@ -56,8 +64,11 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var documentEditor = await DocumentEditor.CreateAsync(_document, cancellationToken).ConfigureAwait(false);
var addUsingDirective = false;
foreach (var (statusCode, returnType) in results.OrderBy(s => s.statusCode))
foreach (var item in results.OrderBy(s => s.statusCode))
{
var statusCode = item.statusCode;
var returnType = item.typeSymbol;
AttributeSyntax attributeSyntax;
bool addUsing;
@ -113,7 +124,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
return document.WithSyntaxRoot(root);
}
private async Task<CodeActionContext> CreateCodeActionContext(CancellationToken cancellationToken)
private async Task<CodeActionContext?> CreateCodeActionContext(CancellationToken cancellationToken)
{
var root = await _document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
var semanticModel = await _document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
@ -124,7 +135,10 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var statusCodesType = semanticModel.Compilation.GetTypeByMetadataName(ApiSymbolNames.HttpStatusCodes);
var statusCodeConstants = GetStatusCodeConstants(statusCodesType);
var symbolCache = new ApiControllerSymbolCache(semanticModel.Compilation);
if (!ApiControllerSymbolCache.TryCreate(semanticModel.Compilation, out var symbolCache))
{
return null;
}
var codeActionContext = new CodeActionContext(semanticModel, symbolCache, method, methodSyntax, statusCodeConstants, cancellationToken);
return codeActionContext;
@ -152,15 +166,15 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
return statusCodeConstants;
}
private ICollection<(int statusCode, ITypeSymbol typeSymbol)> CalculateStatusCodesToApply(in CodeActionContext context, IList<DeclaredApiResponseMetadata> declaredResponseMetadata)
private ICollection<(int statusCode, ITypeSymbol? typeSymbol)> CalculateStatusCodesToApply(in CodeActionContext context, IList<DeclaredApiResponseMetadata> declaredResponseMetadata)
{
if (!ActualApiResponseMetadataFactory.TryGetActualResponseMetadata(context.SymbolCache, context.SemanticModel, context.MethodSyntax, context.CancellationToken, out var actualResponseMetadata))
{
// If we cannot parse metadata correctly, don't offer fixes.
return Array.Empty<(int, ITypeSymbol)>();
return Array.Empty<(int, ITypeSymbol?)>();
}
var statusCodes = new Dictionary<int, (int, ITypeSymbol)>();
var statusCodes = new Dictionary<int, (int, ITypeSymbol?)>();
foreach (var metadata in actualResponseMetadata)
{
if (DeclaredApiResponseMetadata.TryGetDeclaredMetadata(declaredResponseMetadata, metadata, result: out var declaredMetadata) &&

View File

@ -23,8 +23,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
context.RegisterCompilationStartAction(compilationStartAnalysisContext =>
{
var symbolCache = new ApiControllerSymbolCache(compilationStartAnalysisContext.Compilation);
if (symbolCache.ApiConventionTypeAttribute == null || symbolCache.ApiConventionTypeAttribute.TypeKind == TypeKind.Error)
if (!ApiControllerSymbolCache.TryCreate(compilationStartAnalysisContext.Compilation, out var symbolCache))
{
// No-op if we can't find types we care about.
return;
@ -55,12 +54,18 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
}
var parent = ifOperation.Parent;
if (parent?.Kind == OperationKind.Block)
if (parent == null)
{
parent = parent?.Parent;
// No parent, nothing to do
return;
}
if (parent?.Kind != OperationKind.MethodBodyOperation)
if (parent.Kind == OperationKind.Block && parent.Parent != null)
{
parent = parent.Parent;
}
if (parent.Kind != OperationKind.MethodBodyOperation)
{
// Only support top-level ModelState IsValid checks.
return;

View File

@ -8,30 +8,164 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
{
internal readonly struct ApiControllerSymbolCache
{
public ApiControllerSymbolCache(Compilation compilation)
public static bool TryCreate(Compilation compilation, out ApiControllerSymbolCache symbolCache)
{
ApiConventionMethodAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ApiConventionMethodAttribute);
ApiConventionNameMatchAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ApiConventionNameMatchAttribute);
ApiConventionTypeAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ApiConventionTypeAttribute);
ApiConventionTypeMatchAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ApiConventionTypeMatchAttribute);
ControllerAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ControllerAttribute);
DefaultStatusCodeAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.DefaultStatusCodeAttribute);
IActionResult = compilation.GetTypeByMetadataName(ApiSymbolNames.IActionResult);
IApiBehaviorMetadata = compilation.GetTypeByMetadataName(ApiSymbolNames.IApiBehaviorMetadata);
ModelStateDictionary = compilation.GetTypeByMetadataName(ApiSymbolNames.ModelStateDictionary);
NonActionAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.NonActionAttribute);
NonControllerAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.NonControllerAttribute);
ProblemDetails = compilation.GetTypeByMetadataName(ApiSymbolNames.ProblemDetails);
ProducesDefaultResponseTypeAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ProducesDefaultResponseTypeAttribute);
ProducesErrorResponseTypeAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ProducesErrorResponseTypeAttribute);
ProducesResponseTypeAttribute = compilation.GetTypeByMetadataName(ApiSymbolNames.ProducesResponseTypeAttribute);
symbolCache = default;
if (!TryGetType(ApiSymbolNames.ApiConventionMethodAttribute, out var apiConventionMethodAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ApiConventionNameMatchAttribute, out var apiConventionNameMatchAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ApiConventionTypeAttribute, out var apiConventionTypeAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ApiConventionTypeMatchAttribute, out var apiConventionTypeMatchAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ControllerAttribute, out var controllerAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.DefaultStatusCodeAttribute, out var defaultStatusCodeAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.IActionResult, out var iActionResult))
{
return false;
}
if (!TryGetType(ApiSymbolNames.IApiBehaviorMetadata, out var iApiBehaviorMetadata))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ModelStateDictionary, out var modelStateDictionary))
{
return false;
}
if (!TryGetType(ApiSymbolNames.NonActionAttribute, out var nonActionAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.NonControllerAttribute, out var nonControllerAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ProblemDetails, out var problemDetails))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ProducesDefaultResponseTypeAttribute, out var producesDefaultResponseTypeAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ProducesErrorResponseTypeAttribute, out var producesErrorResponseTypeAttribute))
{
return false;
}
if (!TryGetType(ApiSymbolNames.ProducesResponseTypeAttribute, out var producesResponseTypeAttribute))
{
return false;
}
var statusCodeActionResult = compilation.GetTypeByMetadataName(ApiSymbolNames.IStatusCodeActionResult);
StatusCodeActionResultStatusProperty = (IPropertySymbol)statusCodeActionResult?.GetMembers("StatusCode")[0];
var statusCodeActionResultStatusProperty = (IPropertySymbol?)statusCodeActionResult?.GetMembers("StatusCode")[0];
if (statusCodeActionResultStatusProperty == null)
{
return false;
}
var disposable = compilation.GetSpecialType(SpecialType.System_IDisposable);
var members = disposable.GetMembers(nameof(IDisposable.Dispose));
IDisposableDispose = members.Length == 1 ? (IMethodSymbol)members[0] : null;
var members = disposable?.GetMembers(nameof(IDisposable.Dispose));
var iDisposableDispose = (IMethodSymbol?)members?[0];
if (iDisposableDispose == null)
{
return false;
}
symbolCache = new ApiControllerSymbolCache(
apiConventionMethodAttribute,
apiConventionNameMatchAttribute,
apiConventionTypeAttribute,
apiConventionTypeMatchAttribute,
controllerAttribute,
defaultStatusCodeAttribute,
iActionResult,
iApiBehaviorMetadata,
iDisposableDispose,
statusCodeActionResultStatusProperty,
modelStateDictionary,
nonActionAttribute,
nonControllerAttribute,
problemDetails,
producesDefaultResponseTypeAttribute,
producesResponseTypeAttribute,
producesErrorResponseTypeAttribute);
return true;
bool TryGetType(string typeName, out INamedTypeSymbol typeSymbol)
{
typeSymbol = compilation.GetTypeByMetadataName(typeName);
return typeSymbol != null && typeSymbol.TypeKind != TypeKind.Error;
}
}
private ApiControllerSymbolCache(
INamedTypeSymbol apiConventionMethodAttribute,
INamedTypeSymbol apiConventionNameMatchAttribute,
INamedTypeSymbol apiConventionTypeAttribute,
INamedTypeSymbol apiConventionTypeMatchAttribute,
INamedTypeSymbol controllerAttribute,
INamedTypeSymbol defaultStatusCodeAttribute,
INamedTypeSymbol actionResult,
INamedTypeSymbol apiBehaviorMetadata,
IMethodSymbol disposableDispose,
IPropertySymbol statusCodeActionResultStatusProperty,
ITypeSymbol modelStateDictionary,
INamedTypeSymbol nonActionAttribute,
INamedTypeSymbol nonControllerAttribute,
INamedTypeSymbol problemDetails,
INamedTypeSymbol producesDefaultResponseTypeAttribute,
INamedTypeSymbol producesResponseTypeAttribute,
INamedTypeSymbol producesErrorResponseTypeAttribute)
{
ApiConventionMethodAttribute = apiConventionMethodAttribute;
ApiConventionNameMatchAttribute = apiConventionNameMatchAttribute;
ApiConventionTypeAttribute = apiConventionTypeAttribute;
ApiConventionTypeMatchAttribute = apiConventionTypeMatchAttribute;
ControllerAttribute = controllerAttribute;
DefaultStatusCodeAttribute = defaultStatusCodeAttribute;
IActionResult = actionResult;
IApiBehaviorMetadata = apiBehaviorMetadata;
IDisposableDispose = disposableDispose;
StatusCodeActionResultStatusProperty = statusCodeActionResultStatusProperty;
ModelStateDictionary = modelStateDictionary;
NonActionAttribute = nonActionAttribute;
NonControllerAttribute = nonControllerAttribute;
ProblemDetails = problemDetails;
ProducesDefaultResponseTypeAttribute = producesDefaultResponseTypeAttribute;
ProducesResponseTypeAttribute = producesResponseTypeAttribute;
ProducesErrorResponseTypeAttribute = producesErrorResponseTypeAttribute;
}
public INamedTypeSymbol ApiConventionMethodAttribute { get; }

View File

@ -25,8 +25,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
context.RegisterCompilationStartAction(compilationStartAnalysisContext =>
{
var symbolCache = new ApiControllerSymbolCache(compilationStartAnalysisContext.Compilation);
if (symbolCache.ApiConventionTypeAttribute == null || symbolCache.ApiConventionTypeAttribute.TypeKind == TypeKind.Error)
if (!ApiControllerSymbolCache.TryCreate(compilationStartAnalysisContext.Compilation, out var symbolCache))
{
// No-op if we can't find types we care about.
return;

View File

@ -23,8 +23,8 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
private DeclaredApiResponseMetadata(
int statusCode,
AttributeData attributeData,
IMethodSymbol attributeSource,
AttributeData? attributeData,
IMethodSymbol? attributeSource,
bool @implicit,
bool @default)
{
@ -37,9 +37,9 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
public int StatusCode { get; }
public AttributeData Attribute { get; }
public AttributeData? Attribute { get; }
public IMethodSymbol AttributeSource { get; }
public IMethodSymbol? AttributeSource { get; }
/// <summary>
/// <c>True</c> if this <see cref="DeclaredApiResponseMetadata" /> is the implicit 200 associated with an

View File

@ -9,6 +9,8 @@
<IncludeBuildOutput>false</IncludeBuildOutput>
<GenerateDocumentationFile>false</GenerateDocumentationFile>
<NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>
<NullableContextOptions>enable</NullableContextOptions>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>

View File

@ -80,7 +80,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
return Array.Empty<DeclaredApiResponseMetadata>();
}
private static IMethodSymbol GetMethodFromConventionMethodAttribute(in ApiControllerSymbolCache symbolCache, IMethodSymbol method)
private static IMethodSymbol? GetMethodFromConventionMethodAttribute(in ApiControllerSymbolCache symbolCache, IMethodSymbol method)
{
var attribute = method.GetAttributes(symbolCache.ApiConventionMethodAttribute, inherit: true)
.FirstOrDefault();
@ -113,7 +113,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
return (IMethodSymbol)conventionMethod;
}
private static IMethodSymbol MatchConventionMethod(
private static IMethodSymbol? MatchConventionMethod(
in ApiControllerSymbolCache symbolCache,
IMethodSymbol method,
IReadOnlyList<ITypeSymbol> conventionTypes)

View File

@ -66,7 +66,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
}";
var project = DiagnosticProject.Create(GetType().Assembly, new[] { source });
var compilation = await project.GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var returnType = compilation.GetTypeByMetadataName($"{Namespace}.TestController");
var syntaxTree = returnType.DeclaringSyntaxReferences[0].SyntaxTree;
@ -307,7 +307,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var type = compilation.GetTypeByMetadataName(typeName);
var method = (IMethodSymbol)type.GetMembers(methodName).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var syntaxTree = method.DeclaringSyntaxReferences[0].SyntaxTree;
var methodSyntax = (MethodDeclarationSyntax)syntaxTree.GetRoot().FindNode(method.Locations[0].SourceSpan);
@ -322,7 +322,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
{
// Arrange
var compilation = await GetCompilation("InspectReturnExpressionTests");
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var controllerType = compilation.GetTypeByMetadataName(typeof(TestFiles.InspectReturnExpressionTests.TestController).FullName);
var syntaxTree = controllerType.DeclaringSyntaxReferences[0].SyntaxTree;
@ -342,7 +342,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
{
var project = DiagnosticProject.Create(GetType().Assembly, new[] { source });
var compilation = await project.GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var returnType = compilation.GetTypeByMetadataName($"{Namespace}.{test}");
var syntaxTree = returnType.DeclaringSyntaxReferences[0].SyntaxTree;

View File

@ -37,7 +37,7 @@ namespace TestNamespace
}";
var project = DiagnosticProject.Create(GetType().Assembly, new[] { source });
var compilation = await project.GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var method = (IMethodSymbol)compilation.GetTypeByMetadataName("TestNamespace.TestController").GetMembers("Get").First();
// Act
@ -52,7 +52,7 @@ namespace TestNamespace
{
// Arrange
var compilation = await GetCompilation();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(ApiConventionAnalyzerTest_IndexModel).FullName);
var method = (IMethodSymbol)type.GetMembers(nameof(ApiConventionAnalyzerTest_IndexModel.OnGet)).First();
@ -68,7 +68,7 @@ namespace TestNamespace
{
// Arrange
var compilation = await GetCompilation();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(ApiConventionAnalyzerTest_NotApiController).FullName);
var method = (IMethodSymbol)type.GetMembers(nameof(ApiConventionAnalyzerTest_NotApiController.Index)).First();
@ -84,7 +84,7 @@ namespace TestNamespace
{
// Arrange
var compilation = await GetCompilation();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(ApiConventionAnalyzerTest_NotAction).FullName);
var method = (IMethodSymbol)type.GetMembers(nameof(ApiConventionAnalyzerTest_NotAction.Index)).First();
@ -100,7 +100,7 @@ namespace TestNamespace
{
// Arrange
var compilation = await GetCompilation();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(ApiConventionAnalyzerTest_Valid).FullName);
var method = (IMethodSymbol)type.GetMembers(nameof(ApiConventionAnalyzerTest_Valid.Index)).First();
@ -116,7 +116,7 @@ namespace TestNamespace
{
// Arrange
var compilation = await GetCompilation(nameof(IsApiControllerAction_ReturnsTrue_IfAttributeIsDeclaredOnAssembly));
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var type = compilation.GetTypeByMetadataName(typeof(IsApiControllerAction_ReturnsTrue_IfAttributeIsDeclaredOnAssemblyController).FullName);
var method = (IMethodSymbol)type.GetMembers(nameof(IsApiControllerAction_ReturnsTrue_IfAttributeIsDeclaredOnAssemblyController.Action)).First();

View File

@ -20,7 +20,7 @@
<ItemGroup>
<ProjectReference Include="..\..\Mvc.Api.Analyzers\src\Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj" />
<Reference Include="Microsoft.AspNetCore.Mvc" />
<ProjectReference Include="..\..\Mvc\ref\Microsoft.AspNetCore.Mvc.csproj" />
<Reference Include="Microsoft.AspNetCore.Analyzer.Testing" />
<Reference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" />
</ItemGroup>

View File

@ -431,7 +431,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
private async Task RunMatchTest(string methodName, string conventionMethodName, bool expected)
{
var compilation = await GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var testController = compilation.GetTypeByMetadataName(TestControllerName);
var testConvention = compilation.GetTypeByMetadataName(TestConventionName);
@ -451,7 +451,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
// Arrange
var expected = SymbolApiConventionNameMatchBehavior.Exact;
var compilation = await GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var testConvention = compilation.GetTypeByMetadataName(TestConventionName);
var method = testConvention.GetMembers(nameof(TestConvention.MethodWithoutMatchBehavior)).First();
@ -469,7 +469,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
// Arrange
var expected = SymbolApiConventionNameMatchBehavior.Exact;
var compilation = await GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var testConvention = compilation.GetTypeByMetadataName(TestConventionName);
var method = testConvention.GetMembers(nameof(TestConvention.MethodWithRandomAttributes)).First();
@ -487,7 +487,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
// Arrange
var expected = SymbolApiConventionNameMatchBehavior.Prefix;
var compilation = await GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var testConvention = compilation.GetTypeByMetadataName(TestConventionName);
var method = testConvention.GetMembers(nameof(TestConvention.Get)).First();
@ -505,7 +505,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
// Arrange
var expected = SymbolApiConventionTypeMatchBehavior.AssignableFrom;
var compilation = await GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var testConvention = compilation.GetTypeByMetadataName(TestConventionName);
var method = (IMethodSymbol)testConvention.GetMembers(nameof(TestConvention.Get)).First();
@ -524,7 +524,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
// Arrange
var expected = SymbolApiConventionTypeMatchBehavior.AssignableFrom;
var compilation = await GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var testConvention = compilation.GetTypeByMetadataName(TestConventionName);
var method = (IMethodSymbol)testConvention.GetMembers(nameof(TestConvention.MethodParameterWithRandomAttributes)).First();
@ -543,7 +543,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
// Arrange
var expected = SymbolApiConventionTypeMatchBehavior.Any;
var compilation = await GetCompilationAsync();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
var testConvention = compilation.GetTypeByMetadataName(TestConventionName);
var method = (IMethodSymbol)testConvention.GetMembers(nameof(TestConvention.MethodWithAnyTypeMatchBehaviorParameter)).First();

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerWithoutConvention)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerWithoutConvention.GetPerson)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -39,7 +39,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerWithoutConvention)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerWithoutConvention.PostPerson)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -57,7 +57,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.ActionWithProducesAttribute)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -75,7 +75,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.ActionWithProducesResponseType_StatusCodeInConstructor)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -98,7 +98,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.ActionWithProducesResponseType_StatusCodeAndTypeInConstructor)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -121,7 +121,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.ActionWithProducesResponseType_StatusCodeInConstructorAndProperty)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -144,7 +144,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.ActionWithProducesResponseType_StatusCodeAndTypeInConstructorAndProperty)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -167,7 +167,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.ActionWithCustomProducesResponseTypeAttributeWithArguments)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -189,7 +189,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.GetResponseMetadata_ReturnsValuesFromApiConventionMethodAttribute)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -220,7 +220,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.GetResponseMetadata_WithProducesResponseTypeAndApiConventionMethod)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -242,7 +242,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{nameof(GetResponseMetadata_ControllerActionWithAttributes)}");
var method = (IMethodSymbol)controller.GetMembers(nameof(GetResponseMetadata_ControllerActionWithAttributes.ActionWithCustomApiResponseMetadataProvider)).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -275,7 +275,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName($"{Namespace}.{typeName}");
var method = (IMethodSymbol)controller.GetMembers(methodName).First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -298,7 +298,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName(type.FullName);
var method = (IMethodSymbol)controller.GetMembers().First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -320,7 +320,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var compilation = await GetResponseMetadataCompilation();
var controller = compilation.GetTypeByMetadataName(type.FullName);
var method = (IMethodSymbol)controller.GetMembers().First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetDeclaredResponseMetadata(symbolCache, method);
@ -410,7 +410,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var type = compilation.GetTypeByMetadataName(typeof(GetErrorResponseType_ReturnsProblemDetails_IfNoAttributeIsDiscoveredController).FullName);
var method = (IMethodSymbol)type.GetMembers("Action").First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetErrorResponseType(symbolCache, method);
@ -428,7 +428,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var type = compilation.GetTypeByMetadataName(typeof(GetErrorResponseType_ReturnsTypeDefinedAtAssemblyController).FullName);
var method = (IMethodSymbol)type.GetMembers("Action").First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetErrorResponseType(symbolCache, method);
@ -446,7 +446,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var type = compilation.GetTypeByMetadataName(typeof(GetErrorResponseType_ReturnsTypeDefinedAtControllerController).FullName);
var method = (IMethodSymbol)type.GetMembers("Action").First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetErrorResponseType(symbolCache, method);
@ -464,7 +464,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers
var type = compilation.GetTypeByMetadataName(typeof(GetErrorResponseType_ReturnsTypeDefinedAtActionController).FullName);
var method = (IMethodSymbol)type.GetMembers("Action").First();
var symbolCache = new ApiControllerSymbolCache(compilation);
Assert.True(ApiControllerSymbolCache.TryCreate(compilation, out var symbolCache));
// Act
var result = SymbolApiResponseMetadataProvider.GetErrorResponseType(symbolCache, method);

View File

@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(202)]
public partial class AcceptedAtActionResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public AcceptedAtActionResult(string actionName, string controllerName, object routeValues, object value) : base (default(object)) { }
public AcceptedAtActionResult(string actionName, string controllerName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public string ActionName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string ControllerName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Routing.RouteValueDictionary RouteValues { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -48,8 +48,8 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(202)]
public partial class AcceptedAtRouteResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public AcceptedAtRouteResult(object routeValues, object value) : base (default(object)) { }
public AcceptedAtRouteResult(string routeName, object routeValues, object value) : base (default(object)) { }
public AcceptedAtRouteResult(object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public AcceptedAtRouteResult(string routeName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public string RouteName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Routing.RouteValueDictionary RouteValues { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Mvc.IUrlHelper UrlHelper { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -59,8 +59,8 @@ namespace Microsoft.AspNetCore.Mvc
public partial class AcceptedResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public AcceptedResult() : base (default(object)) { }
public AcceptedResult(string location, object value) : base (default(object)) { }
public AcceptedResult(System.Uri locationUri, object value) : base (default(object)) { }
public AcceptedResult(string location, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public AcceptedResult(System.Uri locationUri, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public string Location { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public override void OnFormatting(Microsoft.AspNetCore.Mvc.ActionContext context) { }
}
@ -151,8 +151,8 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(400)]
public partial class BadRequestObjectResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public BadRequestObjectResult(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) : base (default(object)) { }
public BadRequestObjectResult(object error) : base (default(object)) { }
public BadRequestObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) : base (default(object)) { }
public BadRequestObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object error) : base (default(object)) { }
}
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(400)]
public partial class BadRequestResult : Microsoft.AspNetCore.Mvc.StatusCodeResult
@ -226,8 +226,8 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(409)]
public partial class ConflictObjectResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public ConflictObjectResult(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) : base (default(object)) { }
public ConflictObjectResult(object error) : base (default(object)) { }
public ConflictObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) : base (default(object)) { }
public ConflictObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object error) : base (default(object)) { }
}
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(409)]
public partial class ConflictResult : Microsoft.AspNetCore.Mvc.StatusCodeResult
@ -278,43 +278,43 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted(object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted(string uri) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted(string uri, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted(string uri, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted(System.Uri uri) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted(System.Uri uri, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedResult Accepted(System.Uri uri, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, string controllerName) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, string controllerName, object routeValues) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, string controllerName, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object routeValues) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, string controllerName, object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtActionResult AcceptedAtAction(string actionName, string controllerName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute(object routeValues) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object routeValues) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute(object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute(object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute(string routeName) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute(string routeName, object routeValues) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute(string routeName, object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.AcceptedAtRouteResult AcceptedAtRoute(string routeName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.BadRequestResult BadRequest() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.BadRequestObjectResult BadRequest(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.BadRequestObjectResult BadRequest([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.BadRequestObjectResult BadRequest(object error) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.BadRequestObjectResult BadRequest([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object error) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ChallengeResult Challenge() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
@ -326,9 +326,9 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ConflictResult Conflict() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ConflictObjectResult Conflict(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.ConflictObjectResult Conflict([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ConflictObjectResult Conflict(object error) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.ConflictObjectResult Conflict([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object error) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ContentResult Content(string content) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
@ -338,21 +338,21 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ContentResult Content(string content, string contentType, System.Text.Encoding contentEncoding) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedResult Created(string uri, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedResult Created(string uri, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedResult Created(System.Uri uri, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedResult Created(System.Uri uri, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtActionResult CreatedAtAction(string actionName, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedAtActionResult CreatedAtAction(string actionName, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtActionResult CreatedAtAction(string actionName, object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedAtActionResult CreatedAtAction(string actionName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtActionResult CreatedAtAction(string actionName, string controllerName, object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedAtActionResult CreatedAtAction(string actionName, string controllerName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute(object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute(object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute(string routeName, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute(string routeName, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute(string routeName, object routeValues, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute(string routeName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.FileContentResult File(byte[] fileContents, string contentType) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
@ -422,11 +422,11 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.NotFoundResult NotFound() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.NotFoundObjectResult NotFound(object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.NotFoundObjectResult NotFound([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.OkResult Ok() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.OkObjectResult Ok(object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.OkObjectResult Ok([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.PhysicalFileResult PhysicalFile(string physicalPath, string contentType) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
@ -540,9 +540,9 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.SignOutResult SignOut(params string[] authenticationSchemes) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.StatusCodeResult StatusCode(int statusCode) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.StatusCodeResult StatusCode([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultStatusCodeAttribute]int statusCode) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ObjectResult StatusCode(int statusCode, object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.ObjectResult StatusCode([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultStatusCodeAttribute]int statusCode, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
[System.Diagnostics.DebuggerStepThroughAttribute]
public virtual System.Threading.Tasks.Task<bool> TryUpdateModelAsync(object model, System.Type modelType, string prefix) { throw null; }
@ -572,19 +572,19 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.UnauthorizedResult Unauthorized() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.UnauthorizedObjectResult Unauthorized(object value) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.UnauthorizedObjectResult Unauthorized([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.UnprocessableEntityResult UnprocessableEntity() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.UnprocessableEntityObjectResult UnprocessableEntity(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.UnprocessableEntityObjectResult UnprocessableEntity([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.UnprocessableEntityObjectResult UnprocessableEntity(object error) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.UnprocessableEntityObjectResult UnprocessableEntity([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object error) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ActionResult ValidationProblem() { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ActionResult ValidationProblem(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelStateDictionary) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.ActionResult ValidationProblem([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelStateDictionary) { throw null; }
[Microsoft.AspNetCore.Mvc.NonActionAttribute]
public virtual Microsoft.AspNetCore.Mvc.ActionResult ValidationProblem(Microsoft.AspNetCore.Mvc.ValidationProblemDetails descriptor) { throw null; }
public virtual Microsoft.AspNetCore.Mvc.ActionResult ValidationProblem([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ValidationProblemDetails descriptor) { throw null; }
}
public partial class ControllerContext : Microsoft.AspNetCore.Mvc.ActionContext
{
@ -601,7 +601,7 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(201)]
public partial class CreatedAtActionResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public CreatedAtActionResult(string actionName, string controllerName, object routeValues, object value) : base (default(object)) { }
public CreatedAtActionResult(string actionName, string controllerName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public string ActionName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string ControllerName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Routing.RouteValueDictionary RouteValues { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -611,8 +611,8 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(201)]
public partial class CreatedAtRouteResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public CreatedAtRouteResult(object routeValues, object value) : base (default(object)) { }
public CreatedAtRouteResult(string routeName, object routeValues, object value) : base (default(object)) { }
public CreatedAtRouteResult(object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public CreatedAtRouteResult(string routeName, object routeValues, [Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
public string RouteName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Routing.RouteValueDictionary RouteValues { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Mvc.IUrlHelper UrlHelper { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -914,7 +914,7 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(404)]
public partial class NotFoundObjectResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public NotFoundObjectResult(object value) : base (default(object)) { }
public NotFoundObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
}
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(404)]
public partial class NotFoundResult : Microsoft.AspNetCore.Mvc.StatusCodeResult
@ -928,6 +928,7 @@ namespace Microsoft.AspNetCore.Mvc
public System.Type DeclaredType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Mvc.Formatters.FormatterCollection<Microsoft.AspNetCore.Mvc.Formatters.IOutputFormatter> Formatters { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public int? StatusCode { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]
public object Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public override System.Threading.Tasks.Task ExecuteResultAsync(Microsoft.AspNetCore.Mvc.ActionContext context) { throw null; }
public virtual void OnFormatting(Microsoft.AspNetCore.Mvc.ActionContext context) { }
@ -1167,7 +1168,7 @@ namespace Microsoft.AspNetCore.Mvc
}
public partial class StatusCodeResult : Microsoft.AspNetCore.Mvc.ActionResult, Microsoft.AspNetCore.Mvc.IActionResult, Microsoft.AspNetCore.Mvc.Infrastructure.IClientErrorActionResult, Microsoft.AspNetCore.Mvc.Infrastructure.IStatusCodeActionResult
{
public StatusCodeResult(int statusCode) { }
public StatusCodeResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultStatusCodeAttribute]int statusCode) { }
int? Microsoft.AspNetCore.Mvc.Infrastructure.IStatusCodeActionResult.StatusCode { get { throw null; } }
public int StatusCode { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public override void ExecuteResult(Microsoft.AspNetCore.Mvc.ActionContext context) { }
@ -1186,7 +1187,7 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(401)]
public partial class UnauthorizedObjectResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public UnauthorizedObjectResult(object value) : base (default(object)) { }
public UnauthorizedObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object value) : base (default(object)) { }
}
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(401)]
public partial class UnauthorizedResult : Microsoft.AspNetCore.Mvc.StatusCodeResult
@ -1196,8 +1197,8 @@ namespace Microsoft.AspNetCore.Mvc
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(422)]
public partial class UnprocessableEntityObjectResult : Microsoft.AspNetCore.Mvc.ObjectResult
{
public UnprocessableEntityObjectResult(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) : base (default(object)) { }
public UnprocessableEntityObjectResult(object error) : base (default(object)) { }
public UnprocessableEntityObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState) : base (default(object)) { }
public UnprocessableEntityObjectResult([Microsoft.AspNetCore.Mvc.Infrastructure.ActionResultObjectValueAttribute]object error) : base (default(object)) { }
}
[Microsoft.AspNetCore.Mvc.Infrastructure.DefaultStatusCodeAttribute(422)]
public partial class UnprocessableEntityResult : Microsoft.AspNetCore.Mvc.StatusCodeResult
@ -1922,6 +1923,16 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
public abstract Microsoft.AspNetCore.Mvc.Infrastructure.ActionDescriptorCollection ActionDescriptors { get; }
public abstract Microsoft.Extensions.Primitives.IChangeToken GetChangeToken();
}
[System.AttributeUsageAttribute(System.AttributeTargets.Parameter | System.AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
public sealed partial class ActionResultObjectValueAttribute : System.Attribute
{
public ActionResultObjectValueAttribute() { }
}
[System.AttributeUsageAttribute(System.AttributeTargets.Parameter, AllowMultiple=false, Inherited=false)]
public sealed partial class ActionResultStatusCodeAttribute : System.Attribute
{
public ActionResultStatusCodeAttribute() { }
}
public partial class CompatibilitySwitch<TValue> : Microsoft.AspNetCore.Mvc.Infrastructure.ICompatibilitySwitch where TValue : struct
{
public CompatibilitySwitch(string name) { }

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
/// ObjectResult { [ActionResultObjectValueAttribute] public object Value { get; set; } }
/// </example>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
internal sealed class ActionResultObjectValueAttribute : Attribute
public sealed class ActionResultObjectValueAttribute : Attribute
{
}
}

View File

@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure
/// StatusCodeResult([ActionResultStatusCodeParameter] int statusCode)
/// </example>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
internal sealed class ActionResultStatusCodeAttribute : Attribute
public sealed class ActionResultStatusCodeAttribute : Attribute
{
}
}

73
src/Mvc/mvc.slnf Normal file
View File

@ -0,0 +1,73 @@
{
"solution": {
"path": "Mvc.sln",
"projects": [
"test\\WebSites\\BasicWebSite\\BasicWebSite.csproj",
"test\\WebSites\\RoutingWebSite\\Mvc.RoutingWebSite.csproj",
"test\\WebSites\\RazorWebSite\\RazorWebSite.csproj",
"test\\WebSites\\FormatterWebSite\\FormatterWebSite.csproj",
"test\\WebSites\\ApiExplorerWebSite\\ApiExplorerWebSite.csproj",
"test\\WebSites\\VersioningWebSite\\VersioningWebSite.csproj",
"test\\WebSites\\TagHelpersWebSite\\TagHelpersWebSite.csproj",
"test\\WebSites\\FilesWebSite\\FilesWebSite.csproj",
"test\\WebSites\\ApplicationModelWebSite\\ApplicationModelWebSite.csproj",
"test\\WebSites\\HtmlGenerationWebSite\\HtmlGenerationWebSite.csproj",
"test\\WebSites\\ErrorPageMiddlewareWebSite\\ErrorPageMiddlewareWebSite.csproj",
"test\\WebSites\\XmlFormattersWebSite\\XmlFormattersWebSite.csproj",
"test\\WebSites\\ControllersFromServicesWebSite\\ControllersFromServicesWebSite.csproj",
"test\\WebSites\\ControllersFromServicesClassLibrary\\ControllersFromServicesClassLibrary.csproj",
"test\\WebSites\\CorsWebSite\\CorsWebSite.csproj",
"samples\\MvcSandbox\\MvcSandbox.csproj",
"test\\WebSites\\SimpleWebSite\\SimpleWebSite.csproj",
"test\\WebSites\\SecurityWebSite\\SecurityWebSite.csproj",
"test\\WebSites\\RazorPagesWebSite\\RazorPagesWebSite.csproj",
"benchmarks\\Microsoft.AspNetCore.Mvc.Performance\\Microsoft.AspNetCore.Mvc.Performance.csproj",
"test\\WebSites\\RazorBuildWebSite\\RazorBuildWebSite.csproj",
"test\\WebSites\\RazorBuildWebSite.Views\\RazorBuildWebSite.Views.csproj",
"Mvc.Analyzers\\src\\Microsoft.AspNetCore.Mvc.Analyzers.csproj",
"Mvc.Analyzers\\test\\Mvc.Analyzers.Test.csproj",
"test\\WebSites\\RazorPagesClassLibrary\\RazorPagesClassLibrary.csproj",
"shared\\Mvc.Views.TestCommon\\Microsoft.AspNetCore.Mvc.Views.TestCommon.csproj",
"Mvc.Api.Analyzers\\test\\Mvc.Api.Analyzers.Test.csproj",
"Mvc.Api.Analyzers\\src\\Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj",
"test\\WebSites\\GenericHostWebSite\\GenericHostWebSite.csproj",
"Mvc\\src\\Microsoft.AspNetCore.Mvc.csproj",
"Mvc\\test\\Microsoft.AspNetCore.Mvc.Test.csproj",
"Mvc.Abstractions\\src\\Microsoft.AspNetCore.Mvc.Abstractions.csproj",
"Mvc.Abstractions\\test\\Microsoft.AspNetCore.Mvc.Abstractions.Test.csproj",
"Mvc.ApiExplorer\\src\\Microsoft.AspNetCore.Mvc.ApiExplorer.csproj",
"Mvc.ApiExplorer\\test\\Microsoft.AspNetCore.Mvc.ApiExplorer.Test.csproj",
"Mvc.Core\\src\\Microsoft.AspNetCore.Mvc.Core.csproj",
"Mvc.Core\\test\\Microsoft.AspNetCore.Mvc.Core.Test.csproj",
"Mvc.Cors\\src\\Microsoft.AspNetCore.Mvc.Cors.csproj",
"Mvc.Cors\\test\\Microsoft.AspNetCore.Mvc.Cors.Test.csproj",
"Mvc.DataAnnotations\\src\\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj",
"Mvc.DataAnnotations\\test\\Microsoft.AspNetCore.Mvc.DataAnnotations.Test.csproj",
"Mvc.Formatters.Json\\src\\Microsoft.AspNetCore.Mvc.Formatters.Json.csproj",
"Mvc.Formatters.Xml\\src\\Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj",
"Mvc.Formatters.Xml\\test\\Microsoft.AspNetCore.Mvc.Formatters.Xml.Test.csproj",
"Mvc.Localization\\src\\Microsoft.AspNetCore.Mvc.Localization.csproj",
"Mvc.Localization\\test\\Microsoft.AspNetCore.Mvc.Localization.Test.csproj",
"Mvc.Razor\\src\\Microsoft.AspNetCore.Mvc.Razor.csproj",
"Mvc.Razor\\test\\Microsoft.AspNetCore.Mvc.Razor.Test.csproj",
"Mvc.RazorPages\\src\\Microsoft.AspNetCore.Mvc.RazorPages.csproj",
"Mvc.RazorPages\\test\\Microsoft.AspNetCore.Mvc.RazorPages.Test.csproj",
"Mvc.TagHelpers\\src\\Microsoft.AspNetCore.Mvc.TagHelpers.csproj",
"Mvc.TagHelpers\\test\\Microsoft.AspNetCore.Mvc.TagHelpers.Test.csproj",
"Mvc.ViewFeatures\\src\\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj",
"Mvc.ViewFeatures\\test\\Microsoft.AspNetCore.Mvc.ViewFeatures.Test.csproj",
"test\\Mvc.FunctionalTests\\Microsoft.AspNetCore.Mvc.FunctionalTests.csproj",
"test\\Mvc.IntegrationTests\\Microsoft.AspNetCore.Mvc.IntegrationTests.csproj",
"shared\\Mvc.TestDiagnosticListener\\Microsoft.AspNetCore.Mvc.TestDiagnosticListener.csproj",
"Mvc.Testing\\src\\Microsoft.AspNetCore.Mvc.Testing.csproj",
"shared\\Mvc.Core.TestCommon\\Microsoft.AspNetCore.Mvc.Core.TestCommon.csproj",
"Mvc.NewtonsoftJson\\src\\Microsoft.AspNetCore.Mvc.NewtonsoftJson.csproj",
"Mvc.NewtonsoftJson\\test\\Microsoft.AspNetCore.Mvc.NewtonsoftJson.Test.csproj",
"Mvc.Razor.RuntimeCompilation\\src\\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.csproj",
"Mvc.Razor.RuntimeCompilation\\test\\Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.Test.csproj",
"test\\WebSites\\RazorBuildWebSite.PrecompiledViews\\RazorBuildWebSite.PrecompiledViews.csproj",
"Mvc.Components.Prerendering\\src\\Microsoft.AspNetCore.Mvc.Components.Prerendering.csproj",
"Mvc.Components.Prerendering\\test\\Microsoft.AspNetCore.Mvc.Components.Prerendering.Test.csproj"
]
}
}