@@ -107,7 +107,7 @@ type LanguageFeature =
107107 | ReturnFromFinal
108108
109109/// LanguageVersion management
110- type LanguageVersion ( versionText ) =
110+ type LanguageVersion ( versionText , ? disabledFeaturesArray : LanguageFeature array ) =
111111
112112 // When we increment language versions here preview is higher than current RTM version
113113 static let languageVersion46 = 4.6 m
@@ -279,19 +279,19 @@ type LanguageVersion(versionText) =
279279
280280 let specifiedString = versionToString specified
281281
282- let mutable disabledFeatures : Set < LanguageFeature > = Set.empty
282+ let disabledFeatures : LanguageFeature array = defaultArg disabledFeaturesArray [||]
283283
284284 /// Check if this feature is supported by the selected langversion
285285 member _.SupportsFeature featureId =
286- if disabledFeatures.Contains featureId then
286+ if Array.contains featureId disabledFeatures then
287287 false
288288 else
289289 match features.TryGetValue featureId with
290290 | true , v -> v <= specified
291291 | false , _ -> false
292292
293- /// Set the disabled features for this language version
294- member _.SetDisabledFeatures ( disabled : Set < LanguageFeature > ) = disabledFeatures <- disabled
293+ /// Create a new LanguageVersion with updated disabled features
294+ member _.WithDisabledFeatures ( disabled : LanguageFeature array ) = LanguageVersion ( versionText , disabled)
295295
296296 /// Has preview been explicitly specified
297297 member _.IsExplicitlySpecifiedAs50OrBefore () =
@@ -430,103 +430,17 @@ type LanguageVersion(versionText) =
430430 | true , v -> versionToString v
431431 | _ -> invalidArg " feature" " Internal error: Unable to find feature."
432432
433- /// Try to parse a feature name string to a LanguageFeature option
433+ /// Try to parse a feature name string to a LanguageFeature option using reflection
434434 static member TryParseFeature ( featureName : string ) =
435- let normalized = featureName.Trim() .ToLowerInvariant()
436-
437- match normalized with
438- | " singleunderscorepattern" -> Some LanguageFeature.SingleUnderscorePattern
439- | " wildcardinforloop" -> Some LanguageFeature.WildCardInForLoop
440- | " relaxwhitespace" -> Some LanguageFeature.RelaxWhitespace
441- | " relaxwhitespace2" -> Some LanguageFeature.RelaxWhitespace2
442- | " strictindentation" -> Some LanguageFeature.StrictIndentation
443- | " nameof" -> Some LanguageFeature.NameOf
444- | " implicityield" -> Some LanguageFeature.ImplicitYield
445- | " opentypedeclaration" -> Some LanguageFeature.OpenTypeDeclaration
446- | " dotlessfloat32literal" -> Some LanguageFeature.DotlessFloat32Literal
447- | " packagemanagement" -> Some LanguageFeature.PackageManagement
448- | " fromendslicing" -> Some LanguageFeature.FromEndSlicing
449- | " fixedindexslice3d4d" -> Some LanguageFeature.FixedIndexSlice3d4d
450- | " andbang" -> Some LanguageFeature.AndBang
451- | " resumablestatemachines" -> Some LanguageFeature.ResumableStateMachines
452- | " nullableoptionalinterop" -> Some LanguageFeature.NullableOptionalInterop
453- | " defaultinterfacememberconsumption" -> Some LanguageFeature.DefaultInterfaceMemberConsumption
454- | " witnesspassing" -> Some LanguageFeature.WitnessPassing
455- | " additionaltypedirectedconversions" -> Some LanguageFeature.AdditionalTypeDirectedConversions
456- | " interfaceswithmultiplegenericinstantiation" -> Some LanguageFeature.InterfacesWithMultipleGenericInstantiation
457- | " stringinterpolation" -> Some LanguageFeature.StringInterpolation
458- | " overloadsforcustomoperations" -> Some LanguageFeature.OverloadsForCustomOperations
459- | " expandedmeasurables" -> Some LanguageFeature.ExpandedMeasurables
460- | " nullnesschecking" -> Some LanguageFeature.NullnessChecking
461- | " structactivepattern" -> Some LanguageFeature.StructActivePattern
462- | " printfbinaryformat" -> Some LanguageFeature.PrintfBinaryFormat
463- | " indexernotationwithoutdot" -> Some LanguageFeature.IndexerNotationWithoutDot
464- | " refcellnotationinformationals" -> Some LanguageFeature.RefCellNotationInformationals
465- | " usebindingvaluediscard" -> Some LanguageFeature.UseBindingValueDiscard
466- | " unionispropertiesvisible" -> Some LanguageFeature.UnionIsPropertiesVisible
467- | " nonvariablepatternstorightofaspatterns" -> Some LanguageFeature.NonVariablePatternsToRightOfAsPatterns
468- | " attributestorightofmodulekeyword" -> Some LanguageFeature.AttributesToRightOfModuleKeyword
469- | " mlcompatrevisions" -> Some LanguageFeature.MLCompatRevisions
470- | " betterexceptionprinting" -> Some LanguageFeature.BetterExceptionPrinting
471- | " delegatetypenameresolutionfix" -> Some LanguageFeature.DelegateTypeNameResolutionFix
472- | " reallylonglists" -> Some LanguageFeature.ReallyLongLists
473- | " errorondeprecatedrequirequalifiedaccess" -> Some LanguageFeature.ErrorOnDeprecatedRequireQualifiedAccess
474- | " requiredpropertiessupport" -> Some LanguageFeature.RequiredPropertiesSupport
475- | " initpropertiessupport" -> Some LanguageFeature.InitPropertiesSupport
476- | " lowercaseduwhenrequirequalifiedaccess" -> Some LanguageFeature.LowercaseDUWhenRequireQualifiedAccess
477- | " interfaceswithabstractstaticmembers" -> Some LanguageFeature.InterfacesWithAbstractStaticMembers
478- | " selftypeconstraints" -> Some LanguageFeature.SelfTypeConstraints
479- | " accessorfunctionshorthand" -> Some LanguageFeature.AccessorFunctionShorthand
480- | " matchnotallowedforunioncasewithnodata" -> Some LanguageFeature.MatchNotAllowedForUnionCaseWithNoData
481- | " csharpextensionattributenotrequired" -> Some LanguageFeature.CSharpExtensionAttributeNotRequired
482- | " errorfornonvirtualmembersoverrides" -> Some LanguageFeature.ErrorForNonVirtualMembersOverrides
483- | " warningwheninliningmethodimplnoinlinemarkedfunction" -> Some LanguageFeature.WarningWhenInliningMethodImplNoInlineMarkedFunction
484- | " escapedotnetformattablestrings" -> Some LanguageFeature.EscapeDotnetFormattableStrings
485- | " arithmeticinliterals" -> Some LanguageFeature.ArithmeticInLiterals
486- | " errorreportingonstaticclasses" -> Some LanguageFeature.ErrorReportingOnStaticClasses
487- | " trywithinseqexpression" -> Some LanguageFeature.TryWithInSeqExpression
488- | " warningwhencopyandupdaterecordchangesallfields" -> Some LanguageFeature.WarningWhenCopyAndUpdateRecordChangesAllFields
489- | " staticmembersininterfaces" -> Some LanguageFeature.StaticMembersInInterfaces
490- | " noninlineliteralsasprintfformat" -> Some LanguageFeature.NonInlineLiteralsAsPrintfFormat
491- | " nestedcopyandupdate" -> Some LanguageFeature.NestedCopyAndUpdate
492- | " extendedstringinterpolation" -> Some LanguageFeature.ExtendedStringInterpolation
493- | " warningwhenmultiplerecdtypechoice" -> Some LanguageFeature.WarningWhenMultipleRecdTypeChoice
494- | " improvedimpliedargumentnames" -> Some LanguageFeature.ImprovedImpliedArgumentNames
495- | " diagnosticforobjinference" -> Some LanguageFeature.DiagnosticForObjInference
496- | " constraintintersectiononflexibletypes" -> Some LanguageFeature.ConstraintIntersectionOnFlexibleTypes
497- | " staticletinrecordsdustemptypes" -> Some LanguageFeature.StaticLetInRecordsDusEmptyTypes
498- | " warningwhentailrecattributebutnontailrecusage" -> Some LanguageFeature.WarningWhenTailRecAttributeButNonTailRecUsage
499- | " unmanagedconstraintcsharpinterop" -> Some LanguageFeature.UnmanagedConstraintCsharpInterop
500- | " whilebang" -> Some LanguageFeature.WhileBang
501- | " reusesamefieldssinstructunions" -> Some LanguageFeature.ReuseSameFieldsInStructUnions
502- | " extendedfixedbindings" -> Some LanguageFeature.ExtendedFixedBindings
503- | " preferstringgetpinnablereference" -> Some LanguageFeature.PreferStringGetPinnableReference
504- | " preferextensionmethodoverplainproperty" -> Some LanguageFeature.PreferExtensionMethodOverPlainProperty
505- | " warningindexedpropertiesgetsetsametype" -> Some LanguageFeature.WarningIndexedPropertiesGetSetSameType
506- | " warningwhentailcallattrononrec" -> Some LanguageFeature.WarningWhenTailCallAttrOnNonRec
507- | " booleanreturningandreturntypedirectedpartialactivepattern" ->
508- Some LanguageFeature.BooleanReturningAndReturnTypeDirectedPartialActivePattern
509- | " enforceattributetargets" -> Some LanguageFeature.EnforceAttributeTargets
510- | " lowerinterpolatedstringtoconcat" -> Some LanguageFeature.LowerInterpolatedStringToConcat
511- | " lowerintegralrangestofastloops" -> Some LanguageFeature.LowerIntegralRangesToFastLoops
512- | " allowaccessmodifierstautopropertiesgettersandsetters" ->
513- Some LanguageFeature.AllowAccessModifiersToAutoPropertiesGettersAndSetters
514- | " lowersimplemappingsincomprehensionstofastloops" -> Some LanguageFeature.LowerSimpleMappingsInComprehensionsToFastLoops
515- | " parsedhashdirectiveargumentnonquotes" -> Some LanguageFeature.ParsedHashDirectiveArgumentNonQuotes
516- | " emptybodiedcomputationexpressions" -> Some LanguageFeature.EmptyBodiedComputationExpressions
517- | " allowobjectexpressionwithoutoverrides" -> Some LanguageFeature.AllowObjectExpressionWithoutOverrides
518- | " dontwarnunuppercaseidentifiersinbindingpatterns" -> Some LanguageFeature.DontWarnOnUppercaseIdentifiersInBindingPatterns
519- | " usetypesubsumptioncache" -> Some LanguageFeature.UseTypeSubsumptionCache
520- | " deprecateplaceswheresecanbemitted" -> Some LanguageFeature.DeprecatePlacesWhereSeqCanBeOmitted
521- | " supportvalueoptionsasoptionalparameters" -> Some LanguageFeature.SupportValueOptionsAsOptionalParameters
522- | " warnwhenunitpassedtoobjarg" -> Some LanguageFeature.WarnWhenUnitPassedToObjArg
523- | " usebangbindingvaluediscard" -> Some LanguageFeature.UseBangBindingValueDiscard
524- | " betteranonymousrecordparsing" -> Some LanguageFeature.BetterAnonymousRecordParsing
525- | " scopednowarn" -> Some LanguageFeature.ScopedNowarn
526- | " erroroninvaliddeclsintypedefinitions" -> Some LanguageFeature.ErrorOnInvalidDeclsInTypeDefinitions
527- | " allowtypedletuseandbang" -> Some LanguageFeature.AllowTypedLetUseAndBang
528- | " returnfromfinal" -> Some LanguageFeature.ReturnFromFinal
529- | _ -> None
435+ let normalized = featureName.Trim()
436+
437+ Microsoft.FSharp.Reflection.FSharpType.GetUnionCases(
438+ typeof< LanguageFeature>,
439+ System.Reflection.BindingFlags.Public
440+ ||| System.Reflection.BindingFlags.NonPublic
441+ )
442+ |> Array.tryFind ( fun case -> System.String.Equals( case.Name, normalized, System.StringComparison.OrdinalIgnoreCase))
443+ |> Option.map ( fun case -> Microsoft.FSharp.Reflection.FSharpValue.MakeUnion( case, [||]) :?> LanguageFeature)
530444
531445 override x.Equals ( yobj : obj ) =
532446 match yobj with
0 commit comments