From 26b53236b1e694090d6fb67bc37813ba4c393c34 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 21 May 2019 16:17:15 -0700 Subject: [PATCH] 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 --- ...esShouldNotBeAppliedToPageModelAnalyzer.cs | 3 +- .../src/CodeAnalysisExtensions.cs | 14 +- .../Microsoft.AspNetCore.Mvc.Analyzers.csproj | 2 + .../src/TopLevelParameterNameAnalyzer.cs | 106 +++++++++-- .../test/Mvc.Analyzers.Test.csproj | 2 +- .../test/TopLevelParameterNameAnalyzerTest.cs | 16 +- .../src/ActualApiResponseMetadata.cs | 7 +- .../src/ActualApiResponseMetadataFactory.cs | 15 +- .../AddResponseTypeAttributeCodeFixAction.cs | 28 ++- ...ireExplicitModelValidationCheckAnalyzer.cs | 15 +- .../src/ApiControllerSymbolCache.cs | 172 ++++++++++++++++-- .../src/ApiConventionAnalyzer.cs | 3 +- .../src/DeclaredApiResponseMetadata.cs | 8 +- ...rosoft.AspNetCore.Mvc.Api.Analyzers.csproj | 2 + .../src/SymbolApiResponseMetadataProvider.cs | 4 +- .../ActualApiResponseMetadataFactoryTest.cs | 8 +- .../test/ApiControllerFactsTest.cs | 12 +- .../test/Mvc.Api.Analyzers.Test.csproj | 2 +- .../test/SymbolApiConventionMatcherTest.cs | 14 +- .../SymbolApiResponseMetadataProviderTest.cs | 36 ++-- ...osoft.AspNetCore.Mvc.Core.netcoreapp3.0.cs | 107 ++++++----- .../ActionResultObjectValueAttribute.cs | 2 +- .../ActionResultStatusCodeAttribute.cs | 2 +- src/Mvc/mvc.slnf | 73 ++++++++ 24 files changed, 486 insertions(+), 167 deletions(-) create mode 100644 src/Mvc/mvc.slnf diff --git a/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs b/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs index 4dc7b6c85d..ee91bde64e 100644 --- a/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs +++ b/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs @@ -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()) { diff --git a/src/Mvc/Mvc.Analyzers/src/CodeAnalysisExtensions.cs b/src/Mvc/Mvc.Analyzers/src/CodeAnalysisExtensions.cs index 72da1b1f4c..50508ab63d 100644 --- a/src/Mvc/Mvc.Analyzers/src/CodeAnalysisExtensions.cs +++ b/src/Mvc/Mvc.Analyzers/src/CodeAnalysisExtensions.cs @@ -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; diff --git a/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj b/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj index 1e92917e80..d3422ae192 100644 --- a/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj +++ b/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj @@ -9,6 +9,8 @@ false false $(MSBuildProjectName).nuspec + enable + enable diff --git a/src/Mvc/Mvc.Analyzers/src/TopLevelParameterNameAnalyzer.cs b/src/Mvc/Mvc.Analyzers/src/TopLevelParameterNameAnalyzer.cs index ad5aeeaeab..c20466bfcc 100644 --- a/src/Mvc/Mvc.Analyzers/src/TopLevelParameterNameAnalyzer.cs +++ b/src/Mvc/Mvc.Analyzers/src/TopLevelParameterNameAnalyzer.cs @@ -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; } diff --git a/src/Mvc/Mvc.Analyzers/test/Mvc.Analyzers.Test.csproj b/src/Mvc/Mvc.Analyzers/test/Mvc.Analyzers.Test.csproj index df8a4a4cb0..522919a556 100644 --- a/src/Mvc/Mvc.Analyzers/test/Mvc.Analyzers.Test.csproj +++ b/src/Mvc/Mvc.Analyzers/test/Mvc.Analyzers.Test.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/Mvc/Mvc.Analyzers/test/TopLevelParameterNameAnalyzerTest.cs b/src/Mvc/Mvc.Analyzers/test/TopLevelParameterNameAnalyzerTest.cs index 7329ae9d13..361f6d3cb5 100644 --- a/src/Mvc/Mvc.Analyzers/test/TopLevelParameterNameAnalyzerTest.cs +++ b/src/Mvc/Mvc.Analyzers/test/TopLevelParameterNameAnalyzerTest.cs @@ -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(); diff --git a/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadata.cs b/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadata.cs index 018967cb10..2fdc277a08 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadata.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadata.cs @@ -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; } } } diff --git a/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadataFactory.cs b/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadataFactory.cs index 83e1c78546..3580535601 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadataFactory.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/ActualApiResponseMetadataFactory.cs @@ -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); diff --git a/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs b/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs index 18b82c2ae1..0e23036cce 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs @@ -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 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 CreateCodeActionContext(CancellationToken cancellationToken) + private async Task 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 declaredResponseMetadata) + private ICollection<(int statusCode, ITypeSymbol? typeSymbol)> CalculateStatusCodesToApply(in CodeActionContext context, IList 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(); + var statusCodes = new Dictionary(); foreach (var metadata in actualResponseMetadata) { if (DeclaredApiResponseMetadata.TryGetDeclaredMetadata(declaredResponseMetadata, metadata, result: out var declaredMetadata) && diff --git a/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCheckAnalyzer.cs b/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCheckAnalyzer.cs index 9a8dc1c714..274609128f 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCheckAnalyzer.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCheckAnalyzer.cs @@ -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; diff --git a/src/Mvc/Mvc.Api.Analyzers/src/ApiControllerSymbolCache.cs b/src/Mvc/Mvc.Api.Analyzers/src/ApiControllerSymbolCache.cs index 37f6b26291..2a41802889 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/ApiControllerSymbolCache.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/ApiControllerSymbolCache.cs @@ -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; } diff --git a/src/Mvc/Mvc.Api.Analyzers/src/ApiConventionAnalyzer.cs b/src/Mvc/Mvc.Api.Analyzers/src/ApiConventionAnalyzer.cs index 6b92ee4c8f..5890981a10 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/ApiConventionAnalyzer.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/ApiConventionAnalyzer.cs @@ -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; diff --git a/src/Mvc/Mvc.Api.Analyzers/src/DeclaredApiResponseMetadata.cs b/src/Mvc/Mvc.Api.Analyzers/src/DeclaredApiResponseMetadata.cs index 30819931d0..c8f2a9c48f 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/DeclaredApiResponseMetadata.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/DeclaredApiResponseMetadata.cs @@ -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; } /// /// True if this is the implicit 200 associated with an diff --git a/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj b/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj index f5efb230a2..d827140aad 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj +++ b/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj @@ -9,6 +9,8 @@ false false $(MSBuildProjectName).nuspec + enable + enable diff --git a/src/Mvc/Mvc.Api.Analyzers/src/SymbolApiResponseMetadataProvider.cs b/src/Mvc/Mvc.Api.Analyzers/src/SymbolApiResponseMetadataProvider.cs index 9b6a1b759c..e8c85489e7 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/SymbolApiResponseMetadataProvider.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/SymbolApiResponseMetadataProvider.cs @@ -80,7 +80,7 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers return Array.Empty(); } - 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 conventionTypes) diff --git a/src/Mvc/Mvc.Api.Analyzers/test/ActualApiResponseMetadataFactoryTest.cs b/src/Mvc/Mvc.Api.Analyzers/test/ActualApiResponseMetadataFactoryTest.cs index bf4a12fd67..d9c15bddaa 100644 --- a/src/Mvc/Mvc.Api.Analyzers/test/ActualApiResponseMetadataFactoryTest.cs +++ b/src/Mvc/Mvc.Api.Analyzers/test/ActualApiResponseMetadataFactoryTest.cs @@ -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; diff --git a/src/Mvc/Mvc.Api.Analyzers/test/ApiControllerFactsTest.cs b/src/Mvc/Mvc.Api.Analyzers/test/ApiControllerFactsTest.cs index e0875d0f93..786aeeb9d7 100644 --- a/src/Mvc/Mvc.Api.Analyzers/test/ApiControllerFactsTest.cs +++ b/src/Mvc/Mvc.Api.Analyzers/test/ApiControllerFactsTest.cs @@ -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(); diff --git a/src/Mvc/Mvc.Api.Analyzers/test/Mvc.Api.Analyzers.Test.csproj b/src/Mvc/Mvc.Api.Analyzers/test/Mvc.Api.Analyzers.Test.csproj index 370646fc2b..6a29876594 100644 --- a/src/Mvc/Mvc.Api.Analyzers/test/Mvc.Api.Analyzers.Test.csproj +++ b/src/Mvc/Mvc.Api.Analyzers/test/Mvc.Api.Analyzers.Test.csproj @@ -20,7 +20,7 @@ - + diff --git a/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiConventionMatcherTest.cs b/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiConventionMatcherTest.cs index 864a6b3791..1d0ab00c1b 100644 --- a/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiConventionMatcherTest.cs +++ b/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiConventionMatcherTest.cs @@ -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(); diff --git a/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiResponseMetadataProviderTest.cs b/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiResponseMetadataProviderTest.cs index d93a2ee158..f9adfa062a 100644 --- a/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiResponseMetadataProviderTest.cs +++ b/src/Mvc/Mvc.Api.Analyzers/test/SymbolApiResponseMetadataProviderTest.cs @@ -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); diff --git a/src/Mvc/Mvc.Core/ref/Microsoft.AspNetCore.Mvc.Core.netcoreapp3.0.cs b/src/Mvc/Mvc.Core/ref/Microsoft.AspNetCore.Mvc.Core.netcoreapp3.0.cs index 3976060e0c..54a8699f3f 100644 --- a/src/Mvc/Mvc.Core/ref/Microsoft.AspNetCore.Mvc.Core.netcoreapp3.0.cs +++ b/src/Mvc/Mvc.Core/ref/Microsoft.AspNetCore.Mvc.Core.netcoreapp3.0.cs @@ -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 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 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 : Microsoft.AspNetCore.Mvc.Infrastructure.ICompatibilitySwitch where TValue : struct { public CompatibilitySwitch(string name) { } diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultObjectValueAttribute.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultObjectValueAttribute.cs index 8a87c33b2b..dc1891561a 100644 --- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultObjectValueAttribute.cs +++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultObjectValueAttribute.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure /// ObjectResult { [ActionResultObjectValueAttribute] public object Value { get; set; } } /// [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] - internal sealed class ActionResultObjectValueAttribute : Attribute + public sealed class ActionResultObjectValueAttribute : Attribute { } } diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultStatusCodeAttribute.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultStatusCodeAttribute.cs index 2b4d1d4119..9d5709ac95 100644 --- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultStatusCodeAttribute.cs +++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultStatusCodeAttribute.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure /// StatusCodeResult([ActionResultStatusCodeParameter] int statusCode) /// [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] - internal sealed class ActionResultStatusCodeAttribute : Attribute + public sealed class ActionResultStatusCodeAttribute : Attribute { } } diff --git a/src/Mvc/mvc.slnf b/src/Mvc/mvc.slnf new file mode 100644 index 0000000000..79d4fb7df0 --- /dev/null +++ b/src/Mvc/mvc.slnf @@ -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" + ] + } +} \ No newline at end of file