295 lines
13 KiB
C#
295 lines
13 KiB
C#
using System;
|
|
using Roslyn.Utilities;
|
|
|
|
namespace Microsoft.CodeAnalysis.CSharp;
|
|
|
|
internal static class MessageIDExtensions
|
|
{
|
|
public static LocalizableErrorArgument Localize(this MessageID id)
|
|
{
|
|
return new LocalizableErrorArgument(id);
|
|
}
|
|
|
|
internal static string? RequiredFeature(this MessageID feature)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
internal static bool CheckFeatureAvailability(this MessageID feature, DiagnosticBag diagnostics, SyntaxNode syntax, Location? location = null)
|
|
{
|
|
return feature.CheckFeatureAvailability(diagnostics, syntax.SyntaxTree.Options, ((SyntaxNode syntax, Location location) tuple) => tuple.location ?? tuple.syntax.Location, (syntax, location));
|
|
}
|
|
|
|
internal static bool CheckFeatureAvailability(this MessageID feature, DiagnosticBag diagnostics, SyntaxToken syntax, Location? location = null)
|
|
{
|
|
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
|
|
return feature.CheckFeatureAvailability(diagnostics, ((SyntaxToken)(ref syntax)).SyntaxTree.Options, ((SyntaxToken syntax, Location location) tuple) => tuple.location ?? ((SyntaxToken)(ref tuple.syntax)).GetLocation(), (syntax, location));
|
|
}
|
|
|
|
internal static bool CheckFeatureAvailability(this MessageID feature, BindingDiagnosticBag diagnostics, SyntaxNode syntax, Location? location = null)
|
|
{
|
|
return feature.CheckFeatureAvailability(diagnostics, syntax.SyntaxTree.Options, ((SyntaxNode syntax, Location location) tuple) => tuple.location ?? tuple.syntax.Location, (syntax, location));
|
|
}
|
|
|
|
internal static bool CheckFeatureAvailability(this MessageID feature, BindingDiagnosticBag diagnostics, SyntaxToken syntax, Location? location = null)
|
|
{
|
|
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
|
|
return feature.CheckFeatureAvailability(diagnostics, ((SyntaxToken)(ref syntax)).SyntaxTree.Options, ((SyntaxToken syntax, Location location) tuple) => tuple.location ?? ((SyntaxToken)(ref tuple.syntax)).GetLocation(), (syntax, location));
|
|
}
|
|
|
|
private static bool CheckFeatureAvailability<TData>(this MessageID feature, DiagnosticBag diagnostics, ParseOptions parseOptions, Func<TData, Location> getLocation, TData data)
|
|
{
|
|
CSDiagnosticInfo featureAvailabilityDiagnosticInfo = feature.GetFeatureAvailabilityDiagnosticInfo((CSharpParseOptions)(object)parseOptions);
|
|
if (featureAvailabilityDiagnosticInfo != null)
|
|
{
|
|
diagnostics.Add((DiagnosticInfo)(object)featureAvailabilityDiagnosticInfo, getLocation(data));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private static bool CheckFeatureAvailability<TData>(this MessageID feature, BindingDiagnosticBag diagnostics, ParseOptions parseOptions, Func<TData, Location> getLocation, TData data)
|
|
{
|
|
CSDiagnosticInfo featureAvailabilityDiagnosticInfo = feature.GetFeatureAvailabilityDiagnosticInfo((CSharpParseOptions)(object)parseOptions);
|
|
if (featureAvailabilityDiagnosticInfo != null)
|
|
{
|
|
diagnostics.Add((DiagnosticInfo?)(object)featureAvailabilityDiagnosticInfo, getLocation(data));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
internal static bool CheckFeatureAvailability(this MessageID feature, BindingDiagnosticBag diagnostics, Compilation compilation, Location location)
|
|
{
|
|
CSDiagnosticInfo featureAvailabilityDiagnosticInfo = feature.GetFeatureAvailabilityDiagnosticInfo((CSharpCompilation)(object)compilation);
|
|
if (featureAvailabilityDiagnosticInfo != null)
|
|
{
|
|
diagnostics.Add((DiagnosticInfo?)(object)featureAvailabilityDiagnosticInfo, location);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
internal static CSDiagnosticInfo? GetFeatureAvailabilityDiagnosticInfo(this MessageID feature, CSharpParseOptions options)
|
|
{
|
|
if (!options.IsFeatureEnabled(feature))
|
|
{
|
|
return GetDisabledFeatureDiagnosticInfo(feature, options.LanguageVersion);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
internal static CSDiagnosticInfo? GetFeatureAvailabilityDiagnosticInfo(this MessageID feature, CSharpCompilation compilation)
|
|
{
|
|
if (!compilation.IsFeatureEnabled(feature))
|
|
{
|
|
return GetDisabledFeatureDiagnosticInfo(feature, compilation.LanguageVersion);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static CSDiagnosticInfo GetDisabledFeatureDiagnosticInfo(MessageID feature, LanguageVersion availableVersion)
|
|
{
|
|
string text = feature.RequiredFeature();
|
|
if (text != null)
|
|
{
|
|
return new CSDiagnosticInfo(ErrorCode.ERR_FeatureIsExperimental, feature.Localize(), text);
|
|
}
|
|
LanguageVersion languageVersion = feature.RequiredVersion();
|
|
if (languageVersion != LanguageVersion.Preview.MapSpecifiedToEffectiveVersion())
|
|
{
|
|
return new CSDiagnosticInfo(availableVersion.GetErrorCode(), feature.Localize(), new CSharpRequiredLanguageVersion(languageVersion));
|
|
}
|
|
return new CSDiagnosticInfo(ErrorCode.ERR_FeatureInPreview, feature.Localize());
|
|
}
|
|
|
|
internal static LanguageVersion RequiredVersion(this MessageID feature)
|
|
{
|
|
switch (feature)
|
|
{
|
|
case MessageID.IDS_FeatureLambdaOptionalParameters:
|
|
case MessageID.IDS_FeatureLambdaParamsArray:
|
|
case MessageID.IDS_FeaturePrimaryConstructors:
|
|
case MessageID.IDS_FeatureUsingTypeAlias:
|
|
case MessageID.IDS_FeatureInstanceMemberInNameof:
|
|
case MessageID.IDS_FeatureInlineArrays:
|
|
case MessageID.IDS_FeatureCollectionExpressions:
|
|
case MessageID.IDS_FeatureRefReadonlyParameters:
|
|
return LanguageVersion.CSharp12;
|
|
case MessageID.IDS_FeatureStaticAbstractMembersInInterfaces:
|
|
case MessageID.IDS_FeatureGenericAttributes:
|
|
case MessageID.IDS_FeatureNewLinesInInterpolations:
|
|
case MessageID.IDS_FeatureListPattern:
|
|
case MessageID.IDS_FeatureCacheStaticMethodGroupConversion:
|
|
case MessageID.IDS_FeatureRawStringLiterals:
|
|
case MessageID.IDS_FeatureSpanCharConstantPattern:
|
|
case MessageID.IDS_FeatureAutoDefaultStructs:
|
|
case MessageID.IDS_FeatureCheckedUserDefinedOperators:
|
|
case MessageID.IDS_FeatureUtf8StringLiterals:
|
|
case MessageID.IDS_FeatureUnsignedRightShift:
|
|
case MessageID.IDS_FeatureRelaxedShiftOperator:
|
|
case MessageID.IDS_FeatureRequiredMembers:
|
|
case MessageID.IDS_FeatureRefFields:
|
|
case MessageID.IDS_FeatureFileTypes:
|
|
return LanguageVersion.CSharp11;
|
|
case MessageID.IDS_FeatureConstantInterpolatedStrings:
|
|
case MessageID.IDS_FeatureMixedDeclarationsAndExpressionsInDeconstruction:
|
|
case MessageID.IDS_FeatureSealedToStringInRecord:
|
|
case MessageID.IDS_FeatureRecordStructs:
|
|
case MessageID.IDS_FeatureWithOnStructs:
|
|
case MessageID.IDS_FeaturePositionalFieldsInRecords:
|
|
case MessageID.IDS_FeatureGlobalUsing:
|
|
case MessageID.IDS_FeatureInferredDelegateType:
|
|
case MessageID.IDS_FeatureLambdaAttributes:
|
|
case MessageID.IDS_FeatureWithOnAnonymousTypes:
|
|
case MessageID.IDS_FeatureExtendedPropertyPatterns:
|
|
case MessageID.IDS_FeatureLambdaReturnType:
|
|
case MessageID.IDS_AsyncMethodBuilderOverride:
|
|
case MessageID.IDS_FeatureImplicitImplementationOfNonPublicMembers:
|
|
case MessageID.IDS_FeatureImprovedInterpolatedStrings:
|
|
case MessageID.IDS_FeatureFileScopedNamespace:
|
|
case MessageID.IDS_FeatureParameterlessStructConstructors:
|
|
case MessageID.IDS_FeatureStructFieldInitializers:
|
|
return LanguageVersion.CSharp10;
|
|
case MessageID.IDS_FeatureStaticAnonymousFunction:
|
|
case MessageID.IDS_FeatureDefaultTypeParameterConstraint:
|
|
case MessageID.IDS_FeatureLambdaDiscardParameters:
|
|
case MessageID.IDS_FeatureLocalFunctionAttributes:
|
|
case MessageID.IDS_FeatureExternLocalFunctions:
|
|
case MessageID.IDS_FeatureMemberNotNull:
|
|
case MessageID.IDS_FeatureNativeInt:
|
|
case MessageID.IDS_FeatureImplicitObjectCreation:
|
|
case MessageID.IDS_FeatureTypePattern:
|
|
case MessageID.IDS_FeatureParenthesizedPattern:
|
|
case MessageID.IDS_FeatureOrPattern:
|
|
case MessageID.IDS_FeatureAndPattern:
|
|
case MessageID.IDS_FeatureNotPattern:
|
|
case MessageID.IDS_FeatureRelationalPattern:
|
|
case MessageID.IDS_FeatureExtendedPartialMethods:
|
|
case MessageID.IDS_TopLevelStatements:
|
|
case MessageID.IDS_FeatureFunctionPointers:
|
|
case MessageID.IDS_FeatureInitOnlySetters:
|
|
case MessageID.IDS_FeatureRecords:
|
|
case MessageID.IDS_FeatureModuleInitializers:
|
|
case MessageID.IDS_FeatureTargetTypedConditional:
|
|
case MessageID.IDS_FeatureCovariantReturnsForOverrides:
|
|
case MessageID.IDS_FeatureExtensionGetEnumerator:
|
|
case MessageID.IDS_FeatureExtensionGetAsyncEnumerator:
|
|
case MessageID.IDS_FeatureVarianceSafetyForStaticInterfaceMembers:
|
|
return LanguageVersion.CSharp9;
|
|
case MessageID.IDS_FeatureNullableReferenceTypes:
|
|
case MessageID.IDS_FeatureAltInterpolatedVerbatimStrings:
|
|
case MessageID.IDS_FeatureCoalesceAssignmentExpression:
|
|
case MessageID.IDS_FeatureUnconstrainedTypeParameterInNullCoalescingOperator:
|
|
case MessageID.IDS_FeatureNotNullGenericTypeConstraint:
|
|
case MessageID.IDS_FeatureIndexOperator:
|
|
case MessageID.IDS_FeatureRangeOperator:
|
|
case MessageID.IDS_FeatureAsyncStreams:
|
|
case MessageID.IDS_FeatureRecursivePatterns:
|
|
case MessageID.IDS_FeatureUsingDeclarations:
|
|
case MessageID.IDS_FeatureStaticLocalFunctions:
|
|
case MessageID.IDS_FeatureNameShadowingInNestedFunctions:
|
|
case MessageID.IDS_FeatureUnmanagedConstructedTypes:
|
|
case MessageID.IDS_FeatureObsoleteOnPropertyAccessor:
|
|
case MessageID.IDS_FeatureReadOnlyMembers:
|
|
case MessageID.IDS_DefaultInterfaceImplementation:
|
|
case MessageID.IDS_OverrideWithConstraints:
|
|
case MessageID.IDS_FeatureNestedStackalloc:
|
|
case MessageID.IDS_FeatureSwitchExpression:
|
|
case MessageID.IDS_FeatureAsyncUsing:
|
|
case MessageID.IDS_FeatureNullPointerConstantPattern:
|
|
case MessageID.IDS_FeatureDisposalPattern:
|
|
return LanguageVersion.CSharp8;
|
|
case MessageID.IDS_FeatureAttributesOnBackingFields:
|
|
case MessageID.IDS_FeatureImprovedOverloadCandidates:
|
|
case MessageID.IDS_FeatureRefReassignment:
|
|
case MessageID.IDS_FeatureRefFor:
|
|
case MessageID.IDS_FeatureRefForEach:
|
|
case MessageID.IDS_FeatureEnumGenericTypeConstraint:
|
|
case MessageID.IDS_FeatureDelegateGenericTypeConstraint:
|
|
case MessageID.IDS_FeatureUnmanagedGenericTypeConstraint:
|
|
case MessageID.IDS_FeatureStackAllocInitializer:
|
|
case MessageID.IDS_FeatureTupleEquality:
|
|
case MessageID.IDS_FeatureExpressionVariablesInQueriesAndInitializers:
|
|
case MessageID.IDS_FeatureExtensibleFixedStatement:
|
|
case MessageID.IDS_FeatureIndexingMovableFixedBuffers:
|
|
return LanguageVersion.CSharp7_3;
|
|
case MessageID.IDS_FeatureLeadingDigitSeparator:
|
|
case MessageID.IDS_FeatureNonTrailingNamedArguments:
|
|
case MessageID.IDS_FeatureReadOnlyReferences:
|
|
case MessageID.IDS_FeatureRefStructs:
|
|
case MessageID.IDS_FeatureReadOnlyStructs:
|
|
case MessageID.IDS_FeatureRefExtensionMethods:
|
|
case MessageID.IDS_FeaturePrivateProtected:
|
|
case MessageID.IDS_FeatureRefConditional:
|
|
return LanguageVersion.CSharp7_2;
|
|
case MessageID.IDS_FeatureDefaultLiteral:
|
|
case MessageID.IDS_FeatureInferredTupleNames:
|
|
case MessageID.IDS_FeatureGenericPatternMatching:
|
|
case MessageID.IDS_FeatureAsyncMain:
|
|
return LanguageVersion.CSharp7_1;
|
|
case MessageID.IDS_FeaturePatternMatching:
|
|
case MessageID.IDS_FeatureThrowExpression:
|
|
case MessageID.IDS_FeatureDiscards:
|
|
case MessageID.IDS_FeatureBinaryLiteral:
|
|
case MessageID.IDS_FeatureDigitSeparator:
|
|
case MessageID.IDS_FeatureLocalFunctions:
|
|
case MessageID.IDS_FeatureRefLocalsReturns:
|
|
case MessageID.IDS_FeatureTuples:
|
|
case MessageID.IDS_FeatureOutVar:
|
|
case MessageID.IDS_FeatureExpressionBodiedAccessor:
|
|
case MessageID.IDS_FeatureExpressionBodiedDeOrConstructor:
|
|
return LanguageVersion.CSharp7;
|
|
case MessageID.IDS_FeatureExceptionFilter:
|
|
case MessageID.IDS_FeatureAutoPropertyInitializer:
|
|
case MessageID.IDS_FeatureNullPropagatingOperator:
|
|
case MessageID.IDS_FeatureExpressionBodiedMethod:
|
|
case MessageID.IDS_FeatureExpressionBodiedProperty:
|
|
case MessageID.IDS_FeatureExpressionBodiedIndexer:
|
|
case MessageID.IDS_FeatureNameof:
|
|
case MessageID.IDS_FeatureDictionaryInitializer:
|
|
case MessageID.IDS_FeatureUsingStatic:
|
|
case MessageID.IDS_FeatureInterpolatedStrings:
|
|
case MessageID.IDS_AwaitInCatchAndFinally:
|
|
case MessageID.IDS_FeatureReadonlyAutoImplementedProperties:
|
|
return LanguageVersion.CSharp6;
|
|
case MessageID.IDS_FeatureAsync:
|
|
return LanguageVersion.CSharp5;
|
|
case MessageID.IDS_FeatureDynamic:
|
|
case MessageID.IDS_FeatureTypeVariance:
|
|
case MessageID.IDS_FeatureNamedArgument:
|
|
case MessageID.IDS_FeatureOptionalParameter:
|
|
return LanguageVersion.CSharp4;
|
|
case MessageID.IDS_FeatureImplicitArray:
|
|
case MessageID.IDS_FeatureImplicitLocal:
|
|
case MessageID.IDS_FeatureAnonymousTypes:
|
|
case MessageID.IDS_FeatureAutoImplementedProperties:
|
|
case MessageID.IDS_FeatureObjectInitializer:
|
|
case MessageID.IDS_FeatureCollectionInitializer:
|
|
case MessageID.IDS_FeatureLambda:
|
|
case MessageID.IDS_FeatureQueryExpression:
|
|
case MessageID.IDS_FeatureExtensionMethod:
|
|
case MessageID.IDS_FeaturePartialMethod:
|
|
return LanguageVersion.CSharp3;
|
|
case MessageID.IDS_FeatureGenerics:
|
|
case MessageID.IDS_FeatureAnonDelegates:
|
|
case MessageID.IDS_FeatureGlobalNamespace:
|
|
case MessageID.IDS_FeatureFixedBuffer:
|
|
case MessageID.IDS_FeaturePragma:
|
|
case MessageID.IDS_FeatureStaticClasses:
|
|
case MessageID.IDS_FeaturePartialTypes:
|
|
case MessageID.IDS_FeatureSwitchOnBool:
|
|
case MessageID.IDS_FeaturePropertyAccessorMods:
|
|
case MessageID.IDS_FeatureExternAlias:
|
|
case MessageID.IDS_FeatureIterators:
|
|
case MessageID.IDS_FeatureDefault:
|
|
case MessageID.IDS_FeatureNullable:
|
|
return LanguageVersion.CSharp2;
|
|
case MessageID.IDS_FeatureModuleAttrLoc:
|
|
return LanguageVersion.CSharp1;
|
|
default:
|
|
throw ExceptionUtilities.UnexpectedValue((object)feature);
|
|
}
|
|
}
|
|
}
|